-@endif
\ No newline at end of file
diff --git a/src/resources/views/base/inc/full_screen_loader.blade.php b/src/resources/views/base/inc/full_screen_loader.blade.php
deleted file mode 100644
index 00f4bee6ec..0000000000
--- a/src/resources/views/base/inc/full_screen_loader.blade.php
+++ /dev/null
@@ -1,136 +0,0 @@
-@push('after_styles')
-
-@endpush
-
-@push('after_scripts')
-
-@endpush
diff --git a/src/resources/views/base/inc/head.blade.php b/src/resources/views/base/inc/head.blade.php
deleted file mode 100644
index b9c255c4d3..0000000000
--- a/src/resources/views/base/inc/head.blade.php
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
- @if (config('backpack.base.meta_robots_content')) @endif
-
- {{-- Encrypted CSRF token for Laravel, in order for Ajax requests to work --}}
- {{ isset($title) ? $title.' :: '.config('backpack.base.project_name') : config('backpack.base.project_name') }}
-
- @yield('before_styles')
- @stack('before_styles')
-
- @foreach(config('backpack.base.styles', []) as $path)
-
- @endforeach
-
- @foreach(config('backpack.base.mix_styles', []) as $path => $manifest)
-
- @endforeach
-
- @if(!empty(config('backpack.base.vite_styles', [])))
- @vite(config('backpack.base.vite_styles', []))
- @endif
-
- @yield('after_styles')
- @stack('after_styles')
-
- {{-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --}}
- {{-- WARNING: Respond.js doesn't work if you view the page via file:// --}}
-
diff --git a/src/resources/views/base/inc/main_header.blade.php b/src/resources/views/base/inc/main_header.blade.php
deleted file mode 100644
index d38619d0c2..0000000000
--- a/src/resources/views/base/inc/main_header.blade.php
+++ /dev/null
@@ -1,14 +0,0 @@
-
- {{-- Logo --}}
-
-
- {!! config('backpack.base.project_logo') !!}
-
-
-
- @include(backpack_view('inc.menu'))
-
diff --git a/src/resources/views/base/inc/menu.blade.php b/src/resources/views/base/inc/menu.blade.php
deleted file mode 100644
index d62a034754..0000000000
--- a/src/resources/views/base/inc/menu.blade.php
+++ /dev/null
@@ -1,32 +0,0 @@
-{{-- =================================================== --}}
-{{-- ========== Top menu items (ordered left) ========== --}}
-{{-- =================================================== --}}
-
-
- @if (backpack_auth()->check())
- {{-- Topbar. Contains the left part --}}
- @include(backpack_view('inc.topbar_left_content'))
- @endif
-
-
-{{-- ========== End of top menu left items ========== --}}
-
-
-
-{{-- ========================================================= --}}
-{{-- ========= Top menu right items (ordered right) ========== --}}
-{{-- ========================================================= --}}
-
- @endif
- @else
- {{-- Topbar. Contains the right part --}}
- @include(backpack_view('inc.topbar_right_content'))
- @include(backpack_view('inc.menu_user_dropdown'))
- @endif
-
-{{-- ========== End of top menu right items ========== --}}
diff --git a/src/resources/views/base/inc/menu_user_dropdown.blade.php b/src/resources/views/base/inc/menu_user_dropdown.blade.php
deleted file mode 100644
index fe64f2b4f7..0000000000
--- a/src/resources/views/base/inc/menu_user_dropdown.blade.php
+++ /dev/null
@@ -1,13 +0,0 @@
-
diff --git a/src/resources/views/crud/columns/checkbox.blade.php b/src/resources/views/crud/columns/checkbox.blade.php
new file mode 100644
index 0000000000..51043d8a16
--- /dev/null
+++ b/src/resources/views/crud/columns/checkbox.blade.php
@@ -0,0 +1 @@
+@include('crud::columns.check')
\ No newline at end of file
diff --git a/src/resources/views/crud/columns/checklist.blade.php b/src/resources/views/crud/columns/checklist.blade.php
new file mode 100644
index 0000000000..67ac690137
--- /dev/null
+++ b/src/resources/views/crud/columns/checklist.blade.php
@@ -0,0 +1 @@
+@include('crud::columns.select')
\ No newline at end of file
diff --git a/src/resources/views/crud/columns/checklist_dependency.blade.php b/src/resources/views/crud/columns/checklist_dependency.blade.php
new file mode 100644
index 0000000000..026b987966
--- /dev/null
+++ b/src/resources/views/crud/columns/checklist_dependency.blade.php
@@ -0,0 +1,40 @@
+
+@php
+ // since this field is sensible to have long list, for example a list of permissions, we enforce
+ // a maximum column width in px so that we avoid taking up the whole table space.
+ $column['maxWidth'] = $column['maxWidth'] ?? 400;
+
+ $primaryDependency = $column['subfields']['primary'];
+ $secondaryDependency = $column['subfields']['secondary'];
+ $secondaryDependency['options'] = $secondaryDependency['value'] = [];
+
+ // Primary dependency field is the direct relation with the entry, so a select multiple is the way to go.
+ $primaryDependency['type'] = 'select_multiple';
+ // The second dependency we build from the items selected in the first dependency plus the direct entry associations.
+ // Having all the information on our side we can use the select from array and give the desired options/values to show.
+ $secondaryDependency['type'] = 'select_from_array';
+
+ // Get the primary and secondary dependencies directly associated with entry.
+ $primaryDependencies = $entry->{$primaryDependency['entity']} ?? [];
+ $secondaryDependencies = $entry->{$secondaryDependency['entity']} ?? [];
+
+ $secondaryDependencyOptions = [];
+ // Loop the primary dependencies to get related secondary dependencies and add them as options for the select.
+ foreach ($primaryDependencies as $primary) {
+ foreach ($primary->{$secondaryDependency['entity']} as $secondary) {
+ $secondaryDependencyOptions[] = $secondary->{$secondaryDependency['attribute']};
+ }
+ }
+
+ // Merge the direct secondary dependencies items with secondary dependencies from primary
+ foreach($secondaryDependencies as $secondary) {
+ $secondaryDependencyOptions[] = $secondary->{$secondaryDependency['attribute']};
+ }
+
+ $secondaryDependency['options'] = $secondaryDependency['value'] = array_unique($secondaryDependencyOptions);
+@endphp
+
+
{{-- Default box --}}
@@ -46,7 +45,7 @@
@include('crud::form_content', [ 'fields' => $crud->fields(), 'action' => 'create' ])
@endif
{{-- This makes sure that all field assets are loaded. --}}
-
@include('crud::fields.inc.wrapper_end')
{{-- ########################################## --}}
@@ -33,7 +37,7 @@
{{-- FIELD JS - will be loaded in the after_scripts section --}}
@push('crud_fields_scripts')
- @loadOnce('bpFieldInitCheckbox')
+ @bassetBlock('backpack/crud/fields/checkbox-field.js')
- @endLoadOnce
+ @endBassetBlock
@endpush
{{-- End of Extra CSS and JS --}}
diff --git a/src/resources/views/crud/fields/checklist.blade.php b/src/resources/views/crud/fields/checklist.blade.php
index 57456fb152..9d8247516b 100644
--- a/src/resources/views/crud/fields/checklist.blade.php
+++ b/src/resources/views/crud/fields/checklist.blade.php
@@ -55,7 +55,7 @@
{{-- If a field type is shown multiple times on a form, the CSS and JS will only be loaded once --}}
{{-- FIELD JS - will be loaded in the after_scripts section --}}
@push('crud_fields_scripts')
- @loadOnce('bpFieldInitChecklist')
+ @bassetBlock('backpack/crud/fields/checklist-field.js')
- @endLoadOnce
+ @endBassetBlock
@endpush
{{-- End of Extra CSS and JS --}}
{{-- ########################################## --}}
diff --git a/src/resources/views/crud/fields/checklist_dependency.blade.php b/src/resources/views/crud/fields/checklist_dependency.blade.php
index f4c057d060..7d35c62515 100644
--- a/src/resources/views/crud/fields/checklist_dependency.blade.php
+++ b/src/resources/views/crud/fields/checklist_dependency.blade.php
@@ -186,16 +186,14 @@ class = 'secondary_list'
{{-- Extra CSS and JS for this particular field --}}
{{-- If a field type is shown multiple times on a form, the CSS and JS will only be loaded once --}}
-@push('crud_fields_scripts')
-
-@endpush
-
{{-- FIELD JS - will be loaded in the after_scripts section --}}
@push('crud_fields_scripts')
+
+
{{-- include checklist_dependency js --}}
- @loadOnce('bpFieldInitChecklistDependencyElement')
+ @bassetBlock('backpack/crud/fields/checklist-dependency-field.js')
- @endLoadOnce
+ @endBassetBlock
@endpush
{{-- End of Extra CSS and JS --}}
{{-- ########################################## --}}
diff --git a/src/resources/views/crud/fields/color.blade.php b/src/resources/views/crud/fields/color.blade.php
index a667e8789b..db66e3234b 100644
--- a/src/resources/views/crud/fields/color.blade.php
+++ b/src/resources/views/crud/fields/color.blade.php
@@ -1,21 +1,67 @@
{{-- html5 color input --}}
+@php
+$value = old_empty_or_null($field['name'], '') ?? $field['value'] ?? $field['default'] ?? '';
+@endphp
+
+
@include('crud::fields.inc.wrapper_start')
@include('crud::fields.inc.translatable_icon')
- @if(isset($field['prefix']) || isset($field['suffix']))
@endforeach
@@ -49,9 +49,13 @@ class="form-check-input"
@include('crud::fields.inc.wrapper_end')
- {{-- FIELD JS - will be loaded in the after_scripts section --}}
- @push('crud_fields_scripts')
- @loadOnce('bpFieldInitRadioElement')
+{{-- ########################################## --}}
+{{-- Extra CSS and JS for this particular field --}}
+{{-- If a field type is shown multiple times on a form, the CSS and JS will only be loaded once --}}
+
+{{-- FIELD JS - will be loaded in the after_scripts section --}}
+@push('crud_fields_scripts')
+ @bassetBlock('backpack/crud/fields/radio-field.js')
- @endLoadOnce
- @endpush
+ @endBassetBlock
+@endpush
+{{-- End of Extra CSS and JS --}}
+{{-- ########################################## --}}
diff --git a/src/resources/views/crud/fields/range.blade.php b/src/resources/views/crud/fields/range.blade.php
index a156b1cee9..d56b8b5249 100644
--- a/src/resources/views/crud/fields/range.blade.php
+++ b/src/resources/views/crud/fields/range.blade.php
@@ -6,6 +6,7 @@
type="range"
name="{{ $field['name'] }}"
value="{{ old_empty_or_null($field['name'], '') ?? $field['value'] ?? $field['default'] ?? '' }}"
+ class="form-range w-100"
@include('crud::fields.inc.attributes')
>
diff --git a/src/resources/views/crud/fields/select.blade.php b/src/resources/views/crud/fields/select.blade.php
index 1d29847ba6..869669fd00 100644
--- a/src/resources/views/crud/fields/select.blade.php
+++ b/src/resources/views/crud/fields/select.blade.php
@@ -22,7 +22,7 @@
@include('crud::fields.inc.translatable_icon')
@if(isset($field['prefix']) || isset($field['suffix']))
@endif
{{-- HINT --}}
diff --git a/src/resources/views/crud/fields/summernote.blade.php b/src/resources/views/crud/fields/summernote.blade.php
index 92fc8de74c..edce8810d1 100644
--- a/src/resources/views/crud/fields/summernote.blade.php
+++ b/src/resources/views/crud/fields/summernote.blade.php
@@ -28,28 +28,30 @@
{{-- Extra CSS and JS for this particular field --}}
{{-- If a field type is shown multiple times on a form, the CSS and JS will only be loaded once --}}
- {{-- FIELD CSS - will be loaded in the after_styles section --}}
+{{-- FIELD CSS - will be loaded in the after_styles section --}}
@push('crud_fields_styles')
{{-- include summernote css --}}
- @loadOnce('packages/summernote/dist/summernote-bs4.css')
- @loadOnce('summernoteCss')
+ @basset('https://unpkg.com/summernote@0.8.20/dist/summernote-bs4.min.css')
+ @basset('https://unpkg.com/summernote@0.8.20/dist/font/summernote.woff2', false)
+ @bassetBlock('backpack/crud/fields/checklist-field.css')
- @endLoadOnce
+ @endBassetBlock
@endpush
+
{{-- FIELD JS - will be loaded in the after_scripts section --}}
@push('crud_fields_scripts')
{{-- include summernote js --}}
- @loadOnce('packages/summernote/dist/summernote-bs4.min.js')
- @loadOnce('bpFieldInitSummernoteElement')
+ @basset('https://unpkg.com/summernote@0.8.20/dist/summernote.min.js')
+ @bassetBlock('backpack/crud/fields/summernote-field.js')
- @endLoadOnce
+ @endBassetBlock
@endpush
{{-- End of Extra CSS and JS --}}
diff --git a/src/resources/views/crud/fields/switch.blade.php b/src/resources/views/crud/fields/switch.blade.php
index 80e4e18c12..4120845c3f 100644
--- a/src/resources/views/crud/fields/switch.blade.php
+++ b/src/resources/views/crud/fields/switch.blade.php
@@ -12,9 +12,9 @@
{{-- Translatable icon --}}
@include('crud::fields.inc.translatable_icon')
-
@endsection
@@ -221,8 +224,8 @@ function tree_element($entry, $key, $all_entries, $crud)
@endsection
@section('after_scripts')
-
-
+ @basset('https://unpkg.com/jquery-ui@1.13.2/dist/jquery-ui.min.js')
+ @basset(base_path('vendor/backpack/crud/src/resources/assets/libs/jquery.mjs.nestedSortable2.js'))
+ @basset('https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.6.0/highlight.min.js')
@endpush
diff --git a/src/resources/views/base/inc/sidebar_content.blade.php b/src/resources/views/ui/inc/menu_items.blade.php
similarity index 66%
rename from src/resources/views/base/inc/sidebar_content.blade.php
rename to src/resources/views/ui/inc/menu_items.blade.php
index 1526d5629e..1fbe687be3 100644
--- a/src/resources/views/base/inc/sidebar_content.blade.php
+++ b/src/resources/views/ui/inc/menu_items.blade.php
@@ -1,2 +1,2 @@
-{{-- This file is used to store sidebar items, inside the Backpack admin panel --}}
+{{-- This file is used for menu items by any Backpack v6 theme --}}
-@includeWhen(!empty($widget['wrapper']), 'backpack::widgets.inc.wrapper_end')
\ No newline at end of file
+@includeWhen(!empty($widget['wrapper']), backpack_view('widgets.inc.wrapper_end'))
\ No newline at end of file
diff --git a/src/resources/views/base/widgets/div.blade.php b/src/resources/views/ui/widgets/div.blade.php
similarity index 54%
rename from src/resources/views/base/widgets/div.blade.php
rename to src/resources/views/ui/widgets/div.blade.php
index f8ff20020c..1b6dec7c0f 100644
--- a/src/resources/views/base/widgets/div.blade.php
+++ b/src/resources/views/ui/widgets/div.blade.php
@@ -1,6 +1,6 @@
-@includeWhen(!empty($widget['wrapper']), 'backpack::widgets.inc.wrapper_start')
+@includeWhen(!empty($widget['wrapper']), backpack_view('widgets.inc.wrapper_start'))
-
-@includeWhen(!empty($widget['wrapper']), 'backpack::widgets.inc.wrapper_end')
\ No newline at end of file
+@includeWhen(!empty($widget['wrapper']), backpack_view('widgets.inc.wrapper_end'))
diff --git a/src/resources/views/base/widgets/inc/wrapper_end.blade.php b/src/resources/views/ui/widgets/inc/wrapper_end.blade.php
similarity index 100%
rename from src/resources/views/base/widgets/inc/wrapper_end.blade.php
rename to src/resources/views/ui/widgets/inc/wrapper_end.blade.php
diff --git a/src/resources/views/base/widgets/inc/wrapper_start.blade.php b/src/resources/views/ui/widgets/inc/wrapper_start.blade.php
similarity index 100%
rename from src/resources/views/base/widgets/inc/wrapper_start.blade.php
rename to src/resources/views/ui/widgets/inc/wrapper_start.blade.php
diff --git a/src/resources/views/base/widgets/jumbotron.blade.php b/src/resources/views/ui/widgets/jumbotron.blade.php
similarity index 78%
rename from src/resources/views/base/widgets/jumbotron.blade.php
rename to src/resources/views/ui/widgets/jumbotron.blade.php
index bc594a26bc..1824dcd716 100644
--- a/src/resources/views/base/widgets/jumbotron.blade.php
+++ b/src/resources/views/ui/widgets/jumbotron.blade.php
@@ -5,7 +5,7 @@
}
@endphp
-@includeWhen(!empty($widget['wrapper']), 'backpack::widgets.inc.wrapper_start')
+@includeWhen(!empty($widget['wrapper']), backpack_view('widgets.inc.wrapper_start'))
-@includeWhen(!empty($widget['wrapper']), 'backpack::widgets.inc.wrapper_end')
\ No newline at end of file
+@includeWhen(!empty($widget['wrapper']), backpack_view('widgets.inc.wrapper_end'))
\ No newline at end of file
diff --git a/src/resources/views/base/widgets/progress.blade.php b/src/resources/views/ui/widgets/progress.blade.php
similarity index 88%
rename from src/resources/views/base/widgets/progress.blade.php
rename to src/resources/views/ui/widgets/progress.blade.php
index 98fdbb7337..159072b0f4 100644
--- a/src/resources/views/base/widgets/progress.blade.php
+++ b/src/resources/views/ui/widgets/progress.blade.php
@@ -3,7 +3,7 @@
$widget['wrapper']['class'] = $widget['wrapper']['class'] ?? $widget['wrapperClass'] ?? 'col-sm-6 col-lg-3';
@endphp
-@includeWhen(!empty($widget['wrapper']), 'backpack::widgets.inc.wrapper_start')
+@includeWhen(!empty($widget['wrapper']), backpack_view('widgets.inc.wrapper_start'))
@if (isset($widget['value']))
@@ -31,4 +31,4 @@
@endif
-@includeWhen(!empty($widget['wrapper']), 'backpack::widgets.inc.wrapper_end')
\ No newline at end of file
+@includeWhen(!empty($widget['wrapper']), backpack_view('widgets.inc.wrapper_end'))
\ No newline at end of file
diff --git a/src/resources/views/base/widgets/progress_white.blade.php b/src/resources/views/ui/widgets/progress_white.blade.php
similarity index 88%
rename from src/resources/views/base/widgets/progress_white.blade.php
rename to src/resources/views/ui/widgets/progress_white.blade.php
index c96c26dc83..89bda5deef 100644
--- a/src/resources/views/base/widgets/progress_white.blade.php
+++ b/src/resources/views/ui/widgets/progress_white.blade.php
@@ -3,7 +3,7 @@
$widget['wrapper']['class'] = $widget['wrapper']['class'] ?? $widget['wrapperClass'] ?? 'col-sm-6 col-lg-3';
@endphp
-@includeWhen(!empty($widget['wrapper']), 'backpack::widgets.inc.wrapper_start')
+@includeWhen(!empty($widget['wrapper']), backpack_view('widgets.inc.wrapper_start'))
@if (isset($widget['value']))
@@ -31,4 +31,4 @@
@endif
-@includeWhen(!empty($widget['wrapper']), 'backpack::widgets.inc.wrapper_end')
\ No newline at end of file
+@includeWhen(!empty($widget['wrapper']), backpack_view('widgets.inc.wrapper_end'))
\ No newline at end of file
diff --git a/src/resources/views/ui/widgets/script.blade.php b/src/resources/views/ui/widgets/script.blade.php
new file mode 100644
index 0000000000..6c738a0c68
--- /dev/null
+++ b/src/resources/views/ui/widgets/script.blade.php
@@ -0,0 +1,8 @@
+@php
+ $src = $widget['src'] ?? $widget['content'] ?? $widget['path'];
+ $attributes = collect($widget)->except(['name', 'section', 'type', 'stack', 'src', 'content', 'path'])->toArray();
+@endphp
+
+@push($widget['stack'] ?? 'after_scripts')
+ @basset($src, true, $attributes)
+@endpush
diff --git a/src/resources/views/base/widgets/style.blade.php b/src/resources/views/ui/widgets/style.blade.php
similarity index 51%
rename from src/resources/views/base/widgets/style.blade.php
rename to src/resources/views/ui/widgets/style.blade.php
index 93d09a68ce..0471ed6b50 100644
--- a/src/resources/views/base/widgets/style.blade.php
+++ b/src/resources/views/ui/widgets/style.blade.php
@@ -2,13 +2,9 @@
$widget['rel'] = $widget['rel'] ?? 'stylesheet';
$href = asset($widget['href'] ?? $widget['content'] ?? $widget['path']);
- $attributes = collect($widget)->except(['name', 'section', 'type', 'stack', 'href', 'content', 'path'])
+ $attributes = collect($widget)->except(['name', 'section', 'type', 'stack', 'href', 'content', 'path'])->toArray();
@endphp
@push($widget['stack'] ?? 'after_styles')
- $value)
- {{ $key }}{!! $value === true || $value === '' ? '' : "=\"$value\"" !!}
- @endforeach
- />
+ @basset($href, true, $attributes, 'style')
@endpush
diff --git a/src/resources/views/ui/widgets/view.blade.php b/src/resources/views/ui/widgets/view.blade.php
new file mode 100644
index 0000000000..ea64047d77
--- /dev/null
+++ b/src/resources/views/ui/widgets/view.blade.php
@@ -0,0 +1,6 @@
+{{-- view field --}}
+@includeWhen(!empty($widget['wrapper']), backpack_view('widgets.inc.wrapper_start'))
+
+ @include($widget['view'], ['widget' => $widget])
+
+@includeWhen(!empty($widget['wrapper']), backpack_view('widgets.inc.wrapper_end'))
\ No newline at end of file
diff --git a/src/routes/backpack/testing.php b/src/routes/backpack/testing.php
index cbfd71f34b..fcbc3a2a0c 100644
--- a/src/routes/backpack/testing.php
+++ b/src/routes/backpack/testing.php
@@ -16,6 +16,6 @@
'prefix' => config('backpack.base.route_prefix', 'admin'),
],
function () {
- Route::crud('users', 'Backpack\CRUD\Tests\Unit\Http\Controllers\UserCrudController');
+ Route::crud('users', 'Backpack\CRUD\Tests\Config\Http\Controllers\UserCrudController');
}
);
diff --git a/tests/BaseTest.php b/tests/BaseTestClass.php
similarity index 83%
rename from tests/BaseTest.php
rename to tests/BaseTestClass.php
index 20ab0cf5f5..67bf0ffa04 100644
--- a/tests/BaseTest.php
+++ b/tests/BaseTestClass.php
@@ -2,11 +2,12 @@
namespace Backpack\CRUD\Tests;
+use Backpack\Basset\BassetServiceProvider;
use Backpack\CRUD\BackpackServiceProvider;
use Illuminate\Support\Facades\Route;
use Orchestra\Testbench\TestCase;
-abstract class BaseTest extends TestCase
+abstract class BaseTestClass extends TestCase
{
/**
* Setup the test environment.
@@ -23,7 +24,7 @@ protected function setUp(): void
'prefix' => config('backpack.base.route_prefix', 'admin'),
],
function () {
- Route::crud('users', 'Backpack\CRUD\Tests\Unit\Http\Controllers\UserCrudController');
+ Route::crud('users', 'Backpack\CRUD\Tests\config\Http\Controllers\UserCrudController');
}
);
}
@@ -31,6 +32,7 @@ function () {
protected function getPackageProviders($app)
{
return [
+ BassetServiceProvider::class,
BackpackServiceProvider::class,
];
}
diff --git a/tests/Unit/CrudPanel/CrudPanelAccessTest.php b/tests/Unit/CrudPanel/CrudPanelAccessTest.php
index 391af7e6cb..811cebb355 100644
--- a/tests/Unit/CrudPanel/CrudPanelAccessTest.php
+++ b/tests/Unit/CrudPanel/CrudPanelAccessTest.php
@@ -3,11 +3,12 @@
namespace Backpack\CRUD\Tests\Unit\CrudPanel;
use Backpack\CRUD\app\Exceptions\AccessDeniedException;
+use Backpack\CRUD\Tests\config\CrudPanel\BaseCrudPanel;
/**
* @covers Backpack\CRUD\app\Library\CrudPanel\Traits\Access
*/
-class CrudPanelAccessTest extends BaseCrudPanelTest
+class CrudPanelAccessTest extends BaseCrudPanel
{
private $unknownPermission = 'unknownPermission';
diff --git a/tests/Unit/CrudPanel/CrudPanelAutoSetTest.php b/tests/Unit/CrudPanel/CrudPanelAutoSetTest.php
index 9192a34a57..b9c4bd0cca 100644
--- a/tests/Unit/CrudPanel/CrudPanelAutoSetTest.php
+++ b/tests/Unit/CrudPanel/CrudPanelAutoSetTest.php
@@ -2,7 +2,7 @@
namespace Backpack\CRUD\Tests\Unit\CrudPanel;
-use Backpack\CRUD\Tests\Unit\Models\ColumnType;
+use Backpack\CRUD\Tests\config\Models\ColumnType;
use Exception;
class MyColumnTypeWithOtherConnection extends ColumnType
@@ -14,7 +14,7 @@ class MyColumnTypeWithOtherConnection extends ColumnType
* @covers Backpack\CRUD\app\Library\CrudPanel\Traits\Autoset
* @covers Backpack\CRUD\app\Library\CrudPanel\CrudPanel
*/
-class CrudPanelAutoSetTest extends BaseDBCrudPanelTest
+class CrudPanelAutoSetTest extends \Backpack\CRUD\Tests\config\CrudPanel\BaseDBCrudPanel
{
private $expectedUnknownFieldType = 'text';
diff --git a/tests/Unit/CrudPanel/CrudPanelAutofocusTest.php b/tests/Unit/CrudPanel/CrudPanelAutofocusTest.php
index 3841a24160..287fad8b14 100644
--- a/tests/Unit/CrudPanel/CrudPanelAutofocusTest.php
+++ b/tests/Unit/CrudPanel/CrudPanelAutofocusTest.php
@@ -2,10 +2,12 @@
namespace Backpack\CRUD\Tests\Unit\CrudPanel;
+use Backpack\CRUD\Tests\config\CrudPanel\BaseCrudPanel;
+
/**
* @covers Backpack\CRUD\app\Library\CrudPanel\Traits\Autofocus
*/
-class CrudPanelAutofocusTest extends BaseCrudPanelTest
+class CrudPanelAutofocusTest extends BaseCrudPanel
{
public function testItCanEnableAndDisableAutofocus()
{
diff --git a/tests/Unit/CrudPanel/CrudPanelButtonsTest.php b/tests/Unit/CrudPanel/CrudPanelButtonsTest.php
index f67e27df3e..af616eba0e 100644
--- a/tests/Unit/CrudPanel/CrudPanelButtonsTest.php
+++ b/tests/Unit/CrudPanel/CrudPanelButtonsTest.php
@@ -3,12 +3,13 @@
namespace Backpack\CRUD\Tests\Unit\CrudPanel;
use Backpack\CRUD\app\Library\CrudPanel\CrudButton;
+use Backpack\CRUD\Tests\config\CrudPanel\BaseCrudPanel;
/**
* @covers Backpack\CRUD\app\Library\CrudPanel\Traits\Buttons
* @covers Backpack\CRUD\app\Library\CrudPanel\CrudButton
*/
-class CrudPanelButtonsTest extends BaseCrudPanelTest
+class CrudPanelButtonsTest extends BaseCrudPanel
{
private $defaultButtonNames = [];
@@ -26,120 +27,105 @@ protected function setUp(): void
$this->crudPanel->setOperation('list');
- $this->topViewButton = new CrudButton('topViewButton', 'top', 'view', 'crud::buttons.show');
- $this->lineViewButton = new CrudButton('lineViewButton', 'line', 'view', 'crud::buttons.update');
- $this->bottomViewButton = new CrudButton('bottomViewButton', 'bottom', 'view', 'crud::buttons.revisions');
-
- $this->topModelFunctionButton = new CrudButton('topModelFunctionButton', 'top', 'someModelFunctionName', 'crud::buttons.show');
+ $this->topViewButton = [
+ 'name' => 'topViewButton',
+ 'stack' => 'top',
+ 'type' => 'view',
+ 'content' => 'crud::buttons.show',
+ 'meta' => [],
+ ];
+ $this->lineViewButton = [
+ 'name' => 'lineViewButton',
+ 'stack' => 'line',
+ 'type' => 'view',
+ 'content' => 'crud::buttons.show',
+ 'position' => null,
+ 'meta' => [],
+ ];
+ $this->bottomViewButton = [
+ 'name' => 'bottomViewButton',
+ 'stack' => 'bottom',
+ 'type' => 'view',
+ 'content' => 'crud::buttons.show',
+ 'position' => null,
+ 'meta' => [],
+ ];
+ $this->topModelFunctionButton = [
+ 'name' => 'topModelFunctionButton',
+ 'stack' => 'top',
+ 'type' => 'model_function',
+ 'content' => 'crud::buttons.show',
+ 'position' => null,
+ 'meta' => [],
+ ];
}
- public function testDefaultButtons()
+ public function testItCanAddMultipleButtons()
{
- $this->assertEquals(count($this->defaultButtonNames), count($this->crudPanel->buttons()));
+ $this->addDefaultButtons();
- foreach ($this->crudPanel->buttons() as $button) {
- $this->assertTrue(in_array($button->name, $this->defaultButtonNames));
- }
+ $this->assertcount(4, $this->crudPanel->buttons());
}
- public function testAddTopButtonTop()
+ public function testCanAddButtonToSpecificStack()
{
+ $this->addDefaultButtons();
$expectedButton = $this->topViewButton;
+ $expectedButton['name'] = 'topViewButtonCustomName';
+ $expectedButton['stack'] = 'top';
+ $expectedButton['position'] = null;
- $this->crudPanel->addButton($expectedButton->stack, $expectedButton->name, $expectedButton->type, $expectedButton->content);
+ $this->crudPanel->addButton($expectedButton['stack'], $expectedButton['name'], $expectedButton['type'], $expectedButton['content']);
- $this->assertEquals($expectedButton, $this->crudPanel->buttons()->last());
- }
-
- public function testAddButtonLine()
- {
- $expectedButton = $this->lineViewButton;
-
- $this->crudPanel->addButton($expectedButton->stack, $expectedButton->name, $expectedButton->type, $expectedButton->content);
-
- $this->assertEquals($expectedButton, $this->crudPanel->buttons()->first());
- }
-
- public function testAddButtonBottom()
- {
- $expectedButton = $this->bottomViewButton;
-
- $this->crudPanel->addButton($expectedButton->stack, $expectedButton->name, $expectedButton->type, $expectedButton->content);
-
- $this->assertEquals($expectedButton, $this->crudPanel->buttons()->last());
- }
-
- public function testAddButtonBottomUnknownStackName()
- {
- $this->markTestIncomplete('Not correctly implemented');
-
- $this->expectException(\Exception::class);
-
- $expectedButton = $this->topViewButton;
-
- // TODO: this should throw an error.
- $this->crudPanel->addButton('unknownStackName', $expectedButton->name, $expectedButton->type, $expectedButton->content);
+ $this->assertEquals($expectedButton, $this->crudPanel->buttons()->last()->toArray());
+ $this->assertCount(3, $this->crudPanel->getButtonsForStack($expectedButton['stack']));
}
public function testAddButtonsWithSameName()
{
$expectedButton = $this->topViewButton;
- $this->crudPanel->addButton($expectedButton->stack, $expectedButton->name, $expectedButton->type, $expectedButton->content);
- $this->crudPanel->addButton($expectedButton->stack, $expectedButton->name, $expectedButton->type, $expectedButton->content);
-
- $this->assertEquals(count($this->defaultButtonNames) + 1, count($this->crudPanel->buttons()));
- }
-
- public function testAddButtonsWithSameNameWithoutReplacing()
- {
- $this->markTestIncomplete('This no longer makes sense in Backpack 4.1. Button names are unique now.');
+ $this->crudPanel->addButton($expectedButton['stack'], $expectedButton['name'], $expectedButton['type'], $expectedButton['content']);
+ $this->crudPanel->addButton($expectedButton['stack'], $expectedButton['name'], $expectedButton['type'], $expectedButton['content']);
- $expectedButton = $this->topViewButton;
+ $this->assertCount(1, $this->crudPanel->buttons());
- $this->crudPanel->addButton($expectedButton->stack, $expectedButton->name, $expectedButton->type, $expectedButton->content, false, false);
- $this->crudPanel->addButton($expectedButton->stack, $expectedButton->name, $expectedButton->type, $expectedButton->content, false, false);
+ $expectedButton2 = $this->bottomViewButton;
+ CrudButton::name($expectedButton2);
+ CrudButton::name($expectedButton2);
- $this->assertEquals(count($this->defaultButtonNames) + 2, count($this->crudPanel->buttons()));
+ $this->assertCount(2, $this->crudPanel->buttons());
}
public function testAddButtonBeginning()
{
- $expectedButton = $this->topViewButton;
-
- $this->crudPanel->addButton($expectedButton->stack, $expectedButton->name, $expectedButton->type, $expectedButton->content, 'beginning');
+ $this->addTestButton('topViewButton');
- $this->assertEquals($expectedButton, $this->crudPanel->buttons()->first());
- }
-
- public function testAddButtonEnd()
- {
- $expectedButton = $this->lineViewButton;
+ $expectedButton = $this->bottomViewButton;
- $this->crudPanel->addButton($expectedButton->stack, $expectedButton->name, $expectedButton->type, $expectedButton->content, 'end');
+ $this->crudPanel->addButton($expectedButton['stack'], $expectedButton['name'], $expectedButton['type'], $expectedButton['content'], 'beginning');
- $this->assertEquals($expectedButton, $this->crudPanel->buttons()->last());
+ $this->assertEquals($expectedButton, $this->crudPanel->buttons()->first()->toArray());
}
- public function testAddButtonUnknownPosition()
+ public function testAddButtonEnd()
{
- $this->markTestIncomplete('Not correctly implemented');
-
- $this->expectException(\Exception::class);
+ $this->addTestButton('lineViewButton');
$expectedButton = $this->lineViewButton;
- // TODO: this should throw an error.
- $this->crudPanel->addButton($expectedButton->stack, $expectedButton->name, $expectedButton->type, $expectedButton->content, 'unknownPosition');
+ $this->crudPanel->addButton($expectedButton['stack'], $expectedButton['name'], $expectedButton['type'], $expectedButton['content'], 'end');
+
+ $this->assertEquals($expectedButton, $this->crudPanel->buttons()->last()->toArray());
}
public function testAddButtonFromModelFunction()
{
$expectedButton = $this->topModelFunctionButton;
- $this->crudPanel->addButton($expectedButton->stack, $expectedButton->name, $expectedButton->type, $expectedButton->content);
+ $this->crudPanel->addButton($expectedButton['stack'], $expectedButton['name'], $expectedButton['type'], $expectedButton['content']);
- $this->assertEquals($expectedButton, $this->crudPanel->buttons()->last());
+ $this->assertEquals($expectedButton, $this->crudPanel->buttons()->last()->toArray());
}
public function testAddButtonFromView()
@@ -147,15 +133,14 @@ public function testAddButtonFromView()
$expectedButton = $this->topViewButton;
$viewName = 'someViewName';
- $this->crudPanel->addButtonFromView($expectedButton->stack, $expectedButton->name, $viewName, $expectedButton->content);
+ $this->crudPanel->addButtonFromView($expectedButton['stack'], $expectedButton['name'], $viewName);
$backpackButtonViewPackage = 'crud::buttons.';
$actualButton = $this->crudPanel->buttons()->last();
- $this->assertEquals($expectedButton->stack, $actualButton->stack);
- $this->assertEquals($expectedButton->name, $actualButton->name);
+ $this->assertEquals($expectedButton['stack'], $actualButton->stack);
+ $this->assertEquals($expectedButton['name'], $actualButton->name);
$this->assertEquals($backpackButtonViewPackage.$viewName, $actualButton->content);
- $this->assertEquals($expectedButton->stack, $actualButton->stack);
}
public function testRemoveButton()
@@ -163,7 +148,7 @@ public function testRemoveButton()
$this->crudPanel->addButton('line', 'update', 'view', 'crud::buttons.update', 'end');
$this->crudPanel->removeButton('update');
- $this->assertEquals(0, count($this->crudPanel->buttons()));
+ $this->assertCount(0, $this->crudPanel->buttons());
$this->assertNull($this->getButtonByName('update'));
}
@@ -173,7 +158,7 @@ public function testRemoveButtons()
$this->crudPanel->addButton('line', 'show', 'view', 'crud::buttons.show', 'end');
$this->crudPanel->removeButtons(['show', 'update']);
- $this->assertEquals(0, count($this->crudPanel->buttons()));
+ $this->assertCount(0, $this->crudPanel->buttons());
$this->assertNull($this->getButtonByName('show'));
$this->assertNull($this->getButtonByName('update'));
}
@@ -185,22 +170,24 @@ public function testRemoveUnknownButtons()
'someOtherButtonName',
];
+ $this->addDefaultButtons();
$this->crudPanel->removeButtons($buttonNames);
- $this->assertEquals(count($this->defaultButtonNames), count($this->crudPanel->buttons()));
+ $this->assertCount(4, $this->crudPanel->buttons());
}
public function testRemoveUnknownButton()
{
- $buttonName = 'someButtonName';
+ $this->addTestButton('topViewButton');
- $this->crudPanel->removeButton($buttonName);
+ $this->crudPanel->removeButton('someButtonName');
- $this->assertEquals(count($this->defaultButtonNames), count($this->crudPanel->buttons()));
+ $this->assertCount(1, $this->crudPanel->buttons());
}
public function testRemoveAllButtons()
{
+ $this->addDefaultButtons();
$this->crudPanel->removeAllButtons();
$this->assertEmpty($this->crudPanel->buttons());
@@ -214,15 +201,16 @@ public function testRemoveButtonFromStack()
$this->crudPanel->removeButtonFromStack($button->name, $button->stack);
- $this->assertEquals(0, count($this->crudPanel->buttons()));
+ $this->assertCount(0, $this->crudPanel->buttons());
$this->assertNull($this->getButtonByName($button->name));
}
public function testRemoveUnknownButtonFromStack()
{
+ $this->addTestButton('lineViewButton');
$this->crudPanel->removeButtonFromStack('someButtonName', 'line');
- $this->assertEquals(count($this->defaultButtonNames), count($this->crudPanel->buttons()));
+ $this->assertCount(1, $this->crudPanel->buttons());
}
public function testRemoveButtonFromUnknownStack()
@@ -234,7 +222,7 @@ public function testRemoveButtonFromUnknownStack()
$this->crudPanel->removeButtonFromStack($button->name, 'someStackName');
- $this->assertEquals(2, count($this->crudPanel->buttons()));
+ $this->assertCount(2, $this->crudPanel->buttons());
}
public function testRemoveAllButtonsFromStack()
@@ -244,14 +232,16 @@ public function testRemoveAllButtonsFromStack()
$this->crudPanel->removeAllButtonsFromStack('line');
- $this->assertEquals(0, count($this->crudPanel->buttons()));
+ $this->assertCount(0, $this->crudPanel->buttons());
}
public function testRemoveAllButtonsFromUnknownStack()
{
+ $this->addTestButton('lineViewButton');
+
$this->crudPanel->removeAllButtonsFromStack('someStackName');
- $this->assertEquals(count($this->defaultButtonNames), count($this->crudPanel->buttons()));
+ $this->assertCount(1, $this->crudPanel->buttons());
}
public function testOrderButtons()
@@ -265,10 +255,34 @@ public function testOrderButtons()
$this->assertEquals(['show', 'test', 'update'], $this->crudPanel->buttons()->pluck('name')->toArray());
}
+ public function testAddButtonFluently()
+ {
+ $button1 = CrudButton::name('lineTest')->to('line')->view('crud::buttons.test')->type('view');
+ $button2 = CrudButton::add('modelFunction')->model_function(function () {
+ return 'test';
+ })->section('top')->makeFirst();
+ $this->assertEquals($button1->toArray(), $this->crudPanel->buttons()->last()->toArray());
+ $button1->makeLast();
+ $this->assertEquals($button2->toArray(), $this->crudPanel->buttons()->first()->toArray());
+ }
+
private function getButtonByName($name)
{
return $this->crudPanel->buttons()->first(function ($value) use ($name) {
return $value->name == $name;
});
}
+
+ private function addDefaultButtons()
+ {
+ CrudButton::name($this->topViewButton);
+ CrudButton::name($this->lineViewButton);
+ CrudButton::name($this->bottomViewButton);
+ CrudButton::name($this->topModelFunctionButton);
+ }
+
+ private function addTestButton($buttonName)
+ {
+ CrudButton::name(array_values($this->{$buttonName}));
+ }
}
diff --git a/tests/Unit/CrudPanel/CrudPanelColumnsTest.php b/tests/Unit/CrudPanel/CrudPanelColumnsTest.php
index ede76a2a49..0f8fb40e5b 100644
--- a/tests/Unit/CrudPanel/CrudPanelColumnsTest.php
+++ b/tests/Unit/CrudPanel/CrudPanelColumnsTest.php
@@ -3,7 +3,7 @@
namespace Backpack\CRUD\Tests\Unit\CrudPanel;
use Backpack\CRUD\app\Library\CrudPanel\CrudColumn;
-use Backpack\CRUD\Tests\Unit\Models\User;
+use Backpack\CRUD\Tests\config\Models\User;
/**
* @covers Backpack\CRUD\app\Library\CrudPanel\Traits\Columns
@@ -11,7 +11,7 @@
* @covers Backpack\CRUD\app\Library\CrudPanel\CrudColumn
* @covers Backpack\CRUD\app\Library\CrudPanel\CrudPanel
*/
-class CrudPanelColumnsTest extends BaseDBCrudPanelTest
+class CrudPanelColumnsTest extends \Backpack\CRUD\Tests\config\CrudPanel\BaseDBCrudPanel
{
private $oneColumnArray = [
'name' => 'column1',
@@ -130,7 +130,7 @@ class CrudPanelColumnsTest extends BaseDBCrudPanelTest
'orderable' => false,
'searchLogic' => false,
'entity' => 'accountDetails',
- 'model' => 'Backpack\CRUD\Tests\Unit\Models\AccountDetails',
+ 'model' => 'Backpack\CRUD\Tests\Config\Models\AccountDetails',
'relation_type' => 'HasOne',
'attribute' => 'nickname',
],
@@ -146,7 +146,7 @@ class CrudPanelColumnsTest extends BaseDBCrudPanelTest
'searchLogic' => false,
'relation_type' => 'HasOne',
'entity' => 'accountDetails.nickname',
- 'model' => 'Backpack\CRUD\Tests\Unit\Models\AccountDetails',
+ 'model' => 'Backpack\CRUD\Tests\Config\Models\AccountDetails',
],
'accountDetails__user' => [
'name' => 'accountDetails.user',
@@ -159,7 +159,7 @@ class CrudPanelColumnsTest extends BaseDBCrudPanelTest
'searchLogic' => false,
'relation_type' => 'BelongsTo',
'entity' => 'accountDetails.user',
- 'model' => 'Backpack\CRUD\Tests\Unit\Models\User',
+ 'model' => 'Backpack\CRUD\Tests\Config\Models\User',
'attribute' => 'name',
],
];
@@ -175,7 +175,7 @@ class CrudPanelColumnsTest extends BaseDBCrudPanelTest
'orderable' => false,
'searchLogic' => false,
'entity' => 'accountDetails',
- 'model' => 'Backpack\CRUD\Tests\Unit\Models\AccountDetails',
+ 'model' => 'Backpack\CRUD\Tests\Config\Models\AccountDetails',
'relation_type' => 'HasOne',
'attribute' => 'nickname',
],
@@ -191,7 +191,7 @@ class CrudPanelColumnsTest extends BaseDBCrudPanelTest
'searchLogic' => false,
'relation_type' => 'HasOne',
'entity' => 'accountDetails.nickname',
- 'model' => 'Backpack\CRUD\Tests\Unit\Models\AccountDetails',
+ 'model' => 'Backpack\CRUD\Tests\Config\Models\AccountDetails',
],
'accountDetails__user' => [
'name' => 'accountDetails.user',
@@ -204,7 +204,7 @@ class CrudPanelColumnsTest extends BaseDBCrudPanelTest
'searchLogic' => false,
'relation_type' => 'BelongsTo',
'entity' => 'accountDetails.user',
- 'model' => 'Backpack\CRUD\Tests\Unit\Models\User',
+ 'model' => 'Backpack\CRUD\Tests\Config\Models\User',
'attribute' => 'name',
],
];
@@ -223,7 +223,7 @@ class CrudPanelColumnsTest extends BaseDBCrudPanelTest
'entity' => 'accountDetails',
'attribute' => 'nickname',
'label' => 'Nickname',
- 'model' => 'Backpack\CRUD\Tests\Unit\Models\AccountDetails',
+ 'model' => 'Backpack\CRUD\Tests\Config\Models\AccountDetails',
'key' => 'nickname',
'tableColumn' => false,
'orderable' => false,
@@ -249,7 +249,7 @@ class CrudPanelColumnsTest extends BaseDBCrudPanelTest
'type' => 'relationship',
'entity' => 'accountDetails.article',
'label' => 'AccountDetails.article',
- 'model' => 'Backpack\CRUD\Tests\Unit\Models\Article',
+ 'model' => 'Backpack\CRUD\Tests\Config\Models\Article',
'key' => 'accountDetails__article',
'tableColumn' => false,
'orderable' => false,
@@ -263,7 +263,7 @@ class CrudPanelColumnsTest extends BaseDBCrudPanelTest
'type' => 'relationship',
'entity' => 'accountDetails.article',
'label' => 'AccountDetails.article',
- 'model' => 'Backpack\CRUD\Tests\Unit\Models\Article',
+ 'model' => 'Backpack\CRUD\Tests\Config\Models\Article',
'key' => 'ac_article_content',
'tableColumn' => false,
'orderable' => false,
@@ -280,7 +280,7 @@ class CrudPanelColumnsTest extends BaseDBCrudPanelTest
'type' => 'select',
'entity' => 'accountDetails.article',
'label' => 'AccountDetails.article',
- 'model' => 'Backpack\CRUD\Tests\Unit\Models\Article',
+ 'model' => 'Backpack\CRUD\Tests\Config\Models\Article',
'key' => 'accountDetails__article',
'tableColumn' => false,
'orderable' => false,
@@ -294,7 +294,7 @@ class CrudPanelColumnsTest extends BaseDBCrudPanelTest
'type' => 'select',
'entity' => 'accountDetails.article',
'label' => 'AccountDetails.article',
- 'model' => 'Backpack\CRUD\Tests\Unit\Models\Article',
+ 'model' => 'Backpack\CRUD\Tests\Config\Models\Article',
'key' => 'ac_article_content',
'tableColumn' => false,
'orderable' => false,
diff --git a/tests/Unit/CrudPanel/CrudPanelCreateTest.php b/tests/Unit/CrudPanel/CrudPanelCreateTest.php
index 927cf0c0d8..8e6c5b10eb 100644
--- a/tests/Unit/CrudPanel/CrudPanelCreateTest.php
+++ b/tests/Unit/CrudPanel/CrudPanelCreateTest.php
@@ -2,14 +2,14 @@
namespace Backpack\CRUD\Tests\Unit\CrudPanel;
-use Backpack\CRUD\Tests\Unit\Models\Article;
-use Backpack\CRUD\Tests\Unit\Models\Bang;
-use Backpack\CRUD\Tests\Unit\Models\Comet;
-use Backpack\CRUD\Tests\Unit\Models\Planet;
-use Backpack\CRUD\Tests\Unit\Models\PlanetNonNullable;
-use Backpack\CRUD\Tests\Unit\Models\Star;
-use Backpack\CRUD\Tests\Unit\Models\Universe;
-use Backpack\CRUD\Tests\Unit\Models\User;
+use Backpack\CRUD\Tests\config\Models\Article;
+use Backpack\CRUD\Tests\config\Models\Bang;
+use Backpack\CRUD\Tests\config\Models\Comet;
+use Backpack\CRUD\Tests\config\Models\Planet;
+use Backpack\CRUD\Tests\config\Models\PlanetNonNullable;
+use Backpack\CRUD\Tests\config\Models\Star;
+use Backpack\CRUD\Tests\config\Models\Universe;
+use Backpack\CRUD\Tests\config\Models\User;
use Faker\Factory;
use Illuminate\Database\Eloquent\Relations\Relation;
use Illuminate\Support\Arr;
@@ -22,7 +22,7 @@
* @covers Backpack\CRUD\app\Library\CrudPanel\Traits\Input
* @covers Backpack\CRUD\app\Library\CrudPanel\Traits\MorphRelationships
*/
-class CrudPanelCreateTest extends BaseDBCrudPanelTest
+class CrudPanelCreateTest extends \Backpack\CRUD\Tests\config\CrudPanel\BaseDBCrudPanel
{
private $nonRelationshipField = [
'name' => 'field1',
@@ -611,7 +611,7 @@ public function testCreateBelongsToFake()
'name' => 'bang_relation_field',
'fake' => true,
'entity' => 'bang',
- 'model' => 'Backpack\CRUD\Tests\Unit\Models\Bang',
+ 'model' => 'Backpack\CRUD\Tests\config\Models\Bang',
'attribute' => 'title',
'group_by' => 'category', // the relationship to entity you want to use for grouping
'group_by_attribute' => 'name', // the attribute on related model, that you want shown
@@ -1261,7 +1261,7 @@ public function testHasManySelectableRelationshipNonNullable()
$this->assertCount(0, $planets);
}
- public function testCreateHasManyRelationWithArrayedNameSubfields()
+ public function testCreateHasManyRelationWithDelimitedNameSubfields()
{
$this->crudPanel->setModel(User::class);
$this->crudPanel->addFields($this->userInputFieldsNoRelationships, 'both');
@@ -1272,7 +1272,7 @@ public function testCreateHasManyRelationWithArrayedNameSubfields()
'name' => 'title',
],
[
- 'name' => ['start_date', 'end_date'],
+ 'name' => 'start_date,end_date',
'type' => 'date_range',
],
],
@@ -1309,7 +1309,7 @@ public function testCreateHasManyRelationWithArrayedNameSubfields()
$this->assertEquals($inputData['universes'][1]['start_date'], $entry->universes()->find(2)->start_date);
}
- public function testCreateHasOneRelationWithArrayedNameSubfields()
+ public function testCreateHasOneRelationWithDelimitedNameSubfields()
{
$this->crudPanel->setModel(User::class);
$this->crudPanel->setOperation('create');
@@ -1322,7 +1322,7 @@ public function testCreateHasOneRelationWithArrayedNameSubfields()
'name' => 'nickname',
],
[
- 'name' => ['start_date', 'end_date'],
+ 'name' => 'start_date,end_date',
],
[
'name' => 'profile_picture',
@@ -1355,7 +1355,7 @@ public function testCreateHasOneRelationWithArrayedNameSubfields()
$this->assertEquals($account_details->end_date, '2091-01-26');
}
- public function testBelongsToManyWithArrayedNameSubfields()
+ public function testBelongsToManyWithDelimitedNameSubfields()
{
$this->crudPanel->setModel(User::class);
$this->crudPanel->addFields($this->userInputFieldsNoRelationships);
@@ -1366,7 +1366,7 @@ public function testBelongsToManyWithArrayedNameSubfields()
'name' => 'notes',
],
[
- 'name' => ['start_date', 'end_date'],
+ 'name' => 'start_date,end_date',
],
],
]);
@@ -1411,7 +1411,7 @@ public function testItCanCreateMorphToFieldsStructure()
$this->crudPanel->addField([
'name' => 'starable',
'morphOptions' => [
- ['Backpack\CRUD\Tests\Unit\Models\User', 'User'],
+ ['Backpack\CRUD\Tests\config\Models\User', 'User'],
],
]);
@@ -1431,8 +1431,8 @@ public function testIPreventsAddingRepeateadMorphOptions()
$this->crudPanel->addField([
'name' => 'starable',
'morphOptions' => [
- ['Backpack\CRUD\Tests\Unit\Models\User', 'User'],
- ['Backpack\CRUD\Tests\Unit\Models\User', 'User'],
+ ['Backpack\CRUD\Tests\config\Models\User', 'User'],
+ ['Backpack\CRUD\Tests\config\Models\User', 'User'],
],
]);
}
@@ -1455,7 +1455,7 @@ public function testItCanAddTheOptionsFromTheMorphMap()
$this->crudPanel->setModel(Star::class);
Relation::morphMap([
- 'user' => 'Backpack\CRUD\Tests\Unit\Models\User',
+ 'user' => 'Backpack\CRUD\Tests\config\Models\User',
]);
$this->crudPanel->addField([
@@ -1466,7 +1466,7 @@ public function testItCanAddTheOptionsFromTheMorphMap()
]);
[$morphTypeField, $morphIdField] = $this->crudPanel->fields()['starable']['subfields'];
- $this->assertEquals(['user' => 'Backpack\CRUD\Tests\Unit\Models\User'], $morphTypeField['morphMap']);
+ $this->assertEquals(['user' => 'Backpack\CRUD\Tests\config\Models\User'], $morphTypeField['morphMap']);
}
public function testItThrowsErrorIfDuplicateMorphMapName()
@@ -1475,7 +1475,7 @@ public function testItThrowsErrorIfDuplicateMorphMapName()
$this->expectException(\Exception::class);
Relation::morphMap([
- 'user' => 'Backpack\CRUD\Tests\Unit\Models\User',
+ 'user' => 'Backpack\CRUD\Tests\config\Models\User',
]);
$this->crudPanel->addField([
diff --git a/tests/Unit/CrudPanel/CrudPanelDeleteTest.php b/tests/Unit/CrudPanel/CrudPanelDeleteTest.php
index 74fd5de271..21efe0b49e 100644
--- a/tests/Unit/CrudPanel/CrudPanelDeleteTest.php
+++ b/tests/Unit/CrudPanel/CrudPanelDeleteTest.php
@@ -2,14 +2,14 @@
namespace Backpack\CRUD\Tests\Unit\CrudPanel;
-use Backpack\CRUD\Tests\Unit\Models\Article;
+use Backpack\CRUD\Tests\config\Models\Article;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Support\Facades\DB;
/**
* @covers Backpack\CRUD\app\Library\CrudPanel\Traits\Delete
*/
-class CrudPanelDeleteTest extends BaseDBCrudPanelTest
+class CrudPanelDeleteTest extends \Backpack\CRUD\Tests\config\CrudPanel\BaseDBCrudPanel
{
public function testDelete()
{
diff --git a/tests/Unit/CrudPanel/CrudPanelErrorsTest.php b/tests/Unit/CrudPanel/CrudPanelErrorsTest.php
index ce578bc037..47ab0f9749 100644
--- a/tests/Unit/CrudPanel/CrudPanelErrorsTest.php
+++ b/tests/Unit/CrudPanel/CrudPanelErrorsTest.php
@@ -2,10 +2,12 @@
namespace Backpack\CRUD\Tests\Unit\CrudPanel;
+use Backpack\CRUD\Tests\config\CrudPanel\BaseCrudPanel;
+
/**
* @covers Backpack\CRUD\app\Library\CrudPanel\Traits\Errors
*/
-class CrudPanelErrorsTest extends BaseCrudPanelTest
+class CrudPanelErrorsTest extends BaseCrudPanel
{
public function testItCanEnableAndDisableInlineErrors()
{
diff --git a/tests/Unit/CrudPanel/CrudPanelFakeColumnsTest.php b/tests/Unit/CrudPanel/CrudPanelFakeColumnsTest.php
index ca59575c50..4c7ad53efa 100644
--- a/tests/Unit/CrudPanel/CrudPanelFakeColumnsTest.php
+++ b/tests/Unit/CrudPanel/CrudPanelFakeColumnsTest.php
@@ -2,12 +2,12 @@
namespace Backpack\CRUD\Tests\Unit\CrudPanel;
-use Backpack\CRUD\Tests\Unit\Models\Article;
+use Backpack\CRUD\Tests\config\Models\Article;
/**
* @covers Backpack\CRUD\app\Library\CrudPanel\Traits\FakeColumns
*/
-class CrudPanelFakeColumnsTest extends BaseDBCrudPanelTest
+class CrudPanelFakeColumnsTest extends \Backpack\CRUD\Tests\config\CrudPanel\BaseDBCrudPanel
{
private $emptyFakeColumnsArray = ['extras'];
diff --git a/tests/Unit/CrudPanel/CrudPanelFakeFieldsTest.php b/tests/Unit/CrudPanel/CrudPanelFakeFieldsTest.php
index 8f3f545462..8735257744 100644
--- a/tests/Unit/CrudPanel/CrudPanelFakeFieldsTest.php
+++ b/tests/Unit/CrudPanel/CrudPanelFakeFieldsTest.php
@@ -2,13 +2,13 @@
namespace Backpack\CRUD\Tests\Unit\CrudPanel;
-use Backpack\CRUD\Tests\Unit\Models\Article;
+use Backpack\CRUD\Tests\config\Models\Article;
use Illuminate\Support\Facades\DB;
/**
* @covers Backpack\CRUD\app\Library\CrudPanel\Traits\FakeFields
*/
-class CrudPanelFakeFieldsTest extends BaseDBCrudPanelTest
+class CrudPanelFakeFieldsTest extends \Backpack\CRUD\Tests\config\CrudPanel\BaseDBCrudPanel
{
private $fakeFieldsArray = [
[
diff --git a/tests/Unit/CrudPanel/CrudPanelFieldsTest.php b/tests/Unit/CrudPanel/CrudPanelFieldsTest.php
index 359eb4d6bc..80f36ecc9d 100644
--- a/tests/Unit/CrudPanel/CrudPanelFieldsTest.php
+++ b/tests/Unit/CrudPanel/CrudPanelFieldsTest.php
@@ -4,8 +4,8 @@
use Arr;
use Backpack\CRUD\app\Library\CrudPanel\CrudField;
-use Backpack\CRUD\Tests\Unit\Models\Star;
-use Backpack\CRUD\Tests\Unit\Models\User;
+use Backpack\CRUD\Tests\config\Models\Star;
+use Backpack\CRUD\Tests\config\Models\User;
use Illuminate\Http\Request;
/**
@@ -14,7 +14,7 @@
* @covers Backpack\CRUD\app\Library\CrudPanel\Traits\FieldsPrivateMethods
* @covers Backpack\CRUD\app\Library\CrudPanel\CrudField
*/
-class CrudPanelFieldsTest extends BaseDBCrudPanelTest
+class CrudPanelFieldsTest extends \Backpack\CRUD\Tests\config\CrudPanel\BaseDBCrudPanel
{
private $oneTextFieldArray = [
'name' => 'field1',
@@ -654,7 +654,7 @@ public function testItAbortsOnUnexpectedEntity()
} catch (\Throwable $e) {
}
$this->assertEquals(
- new \Symfony\Component\HttpKernel\Exception\HttpException(500, 'Looks like field doesNotExist is not properly defined. The doesNotExist() relationship doesn\'t seem to exist on the Backpack\CRUD\Tests\Unit\Models\TestModel model.'),
+ new \Symfony\Component\HttpKernel\Exception\HttpException(500, 'Looks like field doesNotExist is not properly defined. The doesNotExist() relationship doesn\'t seem to exist on the Backpack\CRUD\Tests\Config\Models\TestModel model.'),
$e
);
}
@@ -756,7 +756,7 @@ public function testItCanAddAFluentField()
'entity' => 'bang',
'relation_type' => 'BelongsTo',
'attribute' => 'name',
- 'model' => 'Backpack\CRUD\Tests\Unit\Models\Bang',
+ 'model' => 'Backpack\CRUD\Tests\Config\Models\Bang',
'multiple' => false,
'pivot' => false,
'label' => 'my_label',
@@ -844,7 +844,7 @@ public function testItCanAddMorphFieldsFluently()
{
$this->crudPanel->setModel(Star::class);
$this->crudPanel->field('starable')
- ->addMorphOption('Backpack\CRUD\Tests\Unit\Models\User', 'User')
+ ->addMorphOption('Backpack\CRUD\Tests\config\Models\User', 'User')
->morphTypeField(['attributes' => ['custom-attribute' => true]])
->morphIdField(['attributes' => ['custom-attribute' => true]]);
@@ -888,6 +888,16 @@ public function testItAbortsWithEmptyNamesFluently()
$e
);
}
+
+ public function testCheckReturnTypesForWhenInferingRelation()
+ {
+ $this->crudPanel->setModel(\Backpack\CRUD\Tests\config\Models\UserWithReturnTypes::class);
+ $this->crudPanel->addField('isAnAttribute');
+ $this->crudPanel->addField('isARelation');
+
+ $this->assertEquals(false, $this->crudPanel->fields()['isAnAttribute']['entity']);
+ $this->assertEquals('isARelation', $this->crudPanel->fields()['isARelation']['entity']);
+ }
}
class Invokable
diff --git a/tests/Unit/CrudPanel/CrudPanelFiltersTest.php b/tests/Unit/CrudPanel/CrudPanelFiltersTest.php
index e6780e1e2c..d7224e43d3 100644
--- a/tests/Unit/CrudPanel/CrudPanelFiltersTest.php
+++ b/tests/Unit/CrudPanel/CrudPanelFiltersTest.php
@@ -3,14 +3,15 @@
namespace Backpack\CRUD\Tests\Unit\CrudPanel;
use Backpack\CRUD\app\Library\CrudPanel\CrudFilter;
-use Backpack\CRUD\Tests\Unit\Models\User;
+use Backpack\CRUD\Tests\config\CrudPanel\BaseCrudPanel;
+use Backpack\CRUD\Tests\config\Models\User;
use Config;
/**
* @covers Backpack\CRUD\app\Library\CrudPanel\Traits\Filters
* @covers Backpack\CRUD\app\Library\CrudPanel\CrudFilter
*/
-class CrudPanelFiltersTest extends BaseCrudPanelTest
+class CrudPanelFiltersTest extends BaseCrudPanel
{
protected $testFilter = [[
'name' => 'my_filter',
diff --git a/tests/Unit/CrudPanel/CrudPanelMacroTest.php b/tests/Unit/CrudPanel/CrudPanelMacroTest.php
index da828979db..12287ae90c 100644
--- a/tests/Unit/CrudPanel/CrudPanelMacroTest.php
+++ b/tests/Unit/CrudPanel/CrudPanelMacroTest.php
@@ -2,10 +2,12 @@
namespace Backpack\CRUD\Tests\Unit\CrudPanel;
+use Backpack\CRUD\Tests\config\CrudPanel\BaseCrudPanel;
+
/**
* @covers Backpack\CRUD\app\Library\CrudPanel\Traits\Macroable
*/
-class CrudPanelMacroTest extends BaseCrudPanelTest
+class CrudPanelMacroTest extends BaseCrudPanel
{
public function testItCanRegisterMacro()
{
diff --git a/tests/Unit/CrudPanel/CrudPanelOperationsTest.php b/tests/Unit/CrudPanel/CrudPanelOperationsTest.php
index 03ee18879a..c916b528ac 100644
--- a/tests/Unit/CrudPanel/CrudPanelOperationsTest.php
+++ b/tests/Unit/CrudPanel/CrudPanelOperationsTest.php
@@ -2,10 +2,12 @@
namespace Backpack\CRUD\Tests\Unit\CrudPanel;
+use Backpack\CRUD\Tests\config\CrudPanel\BaseCrudPanel;
+
/**
* @covers Backpack\CRUD\app\Library\CrudPanel\Traits\Operations
*/
-class CrudPanelOperationsTest extends BaseCrudPanelTest
+class CrudPanelOperationsTest extends BaseCrudPanel
{
public function testItCanSetAndGetTheCurrentOperation()
{
diff --git a/tests/Unit/CrudPanel/CrudPanelReadTest.php b/tests/Unit/CrudPanel/CrudPanelReadTest.php
index d9a0ac6b13..3f07ab4f97 100644
--- a/tests/Unit/CrudPanel/CrudPanelReadTest.php
+++ b/tests/Unit/CrudPanel/CrudPanelReadTest.php
@@ -2,9 +2,9 @@
namespace Backpack\CRUD\Tests\Unit\CrudPanel;
-use Backpack\CRUD\Tests\Unit\Models\Article;
-use Backpack\CRUD\Tests\Unit\Models\Role;
-use Backpack\CRUD\Tests\Unit\Models\User;
+use Backpack\CRUD\Tests\config\Models\Article;
+use Backpack\CRUD\Tests\config\Models\Role;
+use Backpack\CRUD\Tests\config\Models\User;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;
@@ -13,7 +13,7 @@
* @covers Backpack\CRUD\app\Library\CrudPanel\Traits\Read
* @covers Backpack\CRUD\app\Library\CrudPanel\CrudPanel
*/
-class CrudPanelReadTest extends BaseDBCrudPanelTest
+class CrudPanelReadTest extends \Backpack\CRUD\Tests\config\CrudPanel\BaseDBCrudPanel
{
private $relationshipColumn = [
'name' => 'user_id',
diff --git a/tests/Unit/CrudPanel/CrudPanelSaveActionsTest.php b/tests/Unit/CrudPanel/CrudPanelSaveActionsTest.php
index 6e3e185867..10702629ba 100644
--- a/tests/Unit/CrudPanel/CrudPanelSaveActionsTest.php
+++ b/tests/Unit/CrudPanel/CrudPanelSaveActionsTest.php
@@ -5,7 +5,7 @@
/**
* @covers Backpack\CRUD\app\Library\CrudPanel\Traits\SaveActions
*/
-class CrudPanelSaveActionsTest extends BaseDBCrudPanelTest
+class CrudPanelSaveActionsTest extends \Backpack\CRUD\Tests\config\CrudPanel\BaseDBCrudPanel
{
private $singleSaveAction;
diff --git a/tests/Unit/CrudPanel/CrudPanelTablePrefixedTests.php b/tests/Unit/CrudPanel/CrudPanelTablePrefixedTests.php
index 9984d906a9..973a807966 100644
--- a/tests/Unit/CrudPanel/CrudPanelTablePrefixedTests.php
+++ b/tests/Unit/CrudPanel/CrudPanelTablePrefixedTests.php
@@ -2,12 +2,12 @@
namespace Backpack\CRUD\Tests\Unit\CrudPanel;
-use Backpack\CRUD\Tests\Unit\Models\User;
+use Backpack\CRUD\Tests\config\Models\User;
/**
* @covers Backpack\CRUD\app\Library\CrudPanel\CrudPanel
*/
-class CrudPanelTablePrefixedTests extends BasePrefixedDBCrudPanelTest
+class CrudPanelTablePrefixedTests extends \Backpack\CRUD\Tests\config\CrudPanel\BasePrefixedDBCrudPanel
{
public function testGetColumnTypeFromColumnNameWithPrefixedDatabase()
{
diff --git a/tests/Unit/CrudPanel/CrudPanelTabsTest.php b/tests/Unit/CrudPanel/CrudPanelTabsTest.php
index 674e07abe1..eb5d028ad0 100644
--- a/tests/Unit/CrudPanel/CrudPanelTabsTest.php
+++ b/tests/Unit/CrudPanel/CrudPanelTabsTest.php
@@ -2,14 +2,14 @@
namespace Backpack\CRUD\Tests\Unit\CrudPanel;
-use Backpack\CRUD\Tests\Unit\Models\Article;
+use Backpack\CRUD\Tests\config\Models\Article;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
/**
* @covers Backpack\CRUD\app\Library\CrudPanel\Traits\Tabs
*/
-class CrudPanelTabsTest extends BaseDBCrudPanelTest
+class CrudPanelTabsTest extends \Backpack\CRUD\Tests\config\CrudPanel\BaseDBCrudPanel
{
private $horizontalTabsType = 'horizontal';
private $verticalTabsType = 'vertical';
diff --git a/tests/Unit/CrudPanel/CrudPanelTest.php b/tests/Unit/CrudPanel/CrudPanelTest.php
index 72070a47df..a467380ebc 100644
--- a/tests/Unit/CrudPanel/CrudPanelTest.php
+++ b/tests/Unit/CrudPanel/CrudPanelTest.php
@@ -2,13 +2,14 @@
namespace Backpack\CRUD\Tests\Unit\CrudPanel;
-use Backpack\CRUD\Tests\Unit\Models\TestModel;
+use Backpack\CRUD\Tests\config\CrudPanel\BaseCrudPanel;
+use Backpack\CRUD\Tests\config\Models\TestModel;
use Illuminate\Database\Eloquent\Builder;
/**
* @covers Backpack\CRUD\app\Library\CrudPanel\CrudPanel
*/
-class CrudPanelTest extends BaseCrudPanelTest
+class CrudPanelTest extends BaseCrudPanel
{
public function testSetModelFromModelClass()
{
@@ -21,7 +22,7 @@ public function testSetModelFromModelClass()
public function testSetModelFromModelClassName()
{
- $modelClassName = '\Backpack\CRUD\Tests\Unit\Models\TestModel';
+ $modelClassName = '\Backpack\CRUD\Tests\config\Models\TestModel';
$this->crudPanel->setModel($modelClassName);
@@ -47,7 +48,7 @@ public function testSetUnknownRouteName()
public function testItThrowsExceptionIfModelIsNotUsingCrudTrait()
{
try {
- $this->crudPanel->setModel('\Backpack\CRUD\Tests\Unit\Models\ModelWithoutCrudTrait');
+ $this->crudPanel->setModel('\Backpack\CRUD\Tests\config\Models\ModelWithoutCrudTrait');
} catch (\Throwable $e) {
}
$this->assertEquals(
diff --git a/tests/Unit/CrudPanel/CrudPanelTitlesAndHeadingsTest.php b/tests/Unit/CrudPanel/CrudPanelTitlesAndHeadingsTest.php
index 0c0770a3f4..b61badbc87 100644
--- a/tests/Unit/CrudPanel/CrudPanelTitlesAndHeadingsTest.php
+++ b/tests/Unit/CrudPanel/CrudPanelTitlesAndHeadingsTest.php
@@ -2,14 +2,14 @@
namespace Backpack\CRUD\Tests\Unit\CrudPanel;
-use Backpack\CRUD\Tests\Unit\Models\User;
+use Backpack\CRUD\Tests\config\Models\User;
use Illuminate\Routing\Route;
/**
* @covers Backpack\CRUD\app\Library\CrudPanel\Traits\HeadingsAndTitles
* @covers Backpack\CRUD\app\Library\CrudPanel\CrudPanel
*/
-class CrudPanelTitlesAndHeadingsTest extends BaseDBCrudPanelTest
+class CrudPanelTitlesAndHeadingsTest extends \Backpack\CRUD\Tests\config\CrudPanel\BaseDBCrudPanel
{
public function testItCanSetAndGetTheTitleFromTheAction()
{
diff --git a/tests/Unit/CrudPanel/CrudPanelUpdateTest.php b/tests/Unit/CrudPanel/CrudPanelUpdateTest.php
index 441bdbcfbd..02289cb24a 100644
--- a/tests/Unit/CrudPanel/CrudPanelUpdateTest.php
+++ b/tests/Unit/CrudPanel/CrudPanelUpdateTest.php
@@ -2,7 +2,7 @@
namespace Backpack\CRUD\Tests\Unit\CrudPanel;
-use Backpack\CRUD\Tests\Unit\Models\User;
+use Backpack\CRUD\Tests\config\Models\User;
use Faker\Factory;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Support\Facades\DB;
@@ -13,7 +13,7 @@
* @covers Backpack\CRUD\app\Library\CrudPanel\Traits\FieldsProtectedMethods
* @covers Backpack\CRUD\app\Library\CrudPanel\Traits\Input
*/
-class CrudPanelUpdateTest extends BaseDBCrudPanelTest
+class CrudPanelUpdateTest extends \Backpack\CRUD\Tests\config\CrudPanel\BaseDBCrudPanel
{
private $userInputFields = [
[
@@ -120,6 +120,56 @@ public function testGetUpdateFieldsUnknownId()
$this->crudPanel->getUpdateFields($unknownId);
}
+ public function testGetUpdateFieldsWithEnum()
+ {
+ $this->crudPanel->setModel(\Backpack\CRUD\Tests\config\Models\ArticleWithEnum::class);
+ $this->crudPanel->addFields([[
+ 'name' => 'id',
+ 'type' => 'hidden',
+ ], [
+ 'name' => 'content',
+ ], [
+ 'name' => 'tags',
+ ], [
+ 'label' => 'Author',
+ 'type' => 'select',
+ 'name' => 'user_id',
+ 'entity' => 'user',
+ 'attribute' => 'name',
+ ], [
+ 'name' => 'status',
+ ],
+ [
+ 'name' => 'state',
+ ],
+ [
+ 'name' => 'style',
+ ],
+ ]);
+ $faker = Factory::create();
+ $inputData = [
+ 'content' => $faker->text(),
+ 'tags' => $faker->words(3, true),
+ 'user_id' => 1,
+ 'metas' => null,
+ 'extras' => null,
+ 'status' => 'publish',
+ 'state' => 'COLD',
+ 'style' => 'DRAFT',
+ 'cast_metas' => null,
+ 'cast_tags' => null,
+ 'cast_extras' => null,
+ ];
+ $article = $this->crudPanel->create($inputData);
+
+ $updateFields = $this->crudPanel->getUpdateFields(2);
+
+ $this->assertTrue($updateFields['status']['value']->value === 'publish');
+ $this->assertTrue($updateFields['status']['value']->name === 'PUBLISHED');
+ $this->assertTrue($updateFields['state']['value']->name === 'COLD');
+ $this->assertTrue($updateFields['style']['value']->color() === 'red');
+ }
+
private function addValuesToExpectedFields($id, $inputData)
{
foreach ($inputData as $key => $value) {
diff --git a/tests/Unit/CrudPanel/CrudPanelValidationTest.php b/tests/Unit/CrudPanel/CrudPanelValidationTest.php
index a31c5e7b9c..de792c4c01 100644
--- a/tests/Unit/CrudPanel/CrudPanelValidationTest.php
+++ b/tests/Unit/CrudPanel/CrudPanelValidationTest.php
@@ -2,13 +2,22 @@
namespace Backpack\CRUD\Tests\Unit\CrudPanel;
-use Backpack\CRUD\Tests\Unit\Http\Requests\UserRequest;
-use Backpack\CRUD\Tests\Unit\Models\User;
+use Backpack\CRUD\app\Library\Validation\Rules\ValidUpload;
+use Backpack\CRUD\app\Library\Validation\Rules\ValidUploadMultiple;
+use Backpack\CRUD\Tests\config\Http\Requests\UserRequest;
+use Backpack\CRUD\Tests\config\Models\User;
+use Illuminate\Http\UploadedFile;
/**
* @covers Backpack\CRUD\app\Library\CrudPanel\Traits\Validation
+ * @covers Backpack\CRUD\app\Library\CrudPanel\Traits\Read
+ * @covers Backpack\CRUD\app\Library\Validation\Rules\BackpackCustomRule
+ * @covers Backpack\CRUD\app\Library\Validation\Rules\ValidUpload
+ * @covers Backpack\CRUD\app\Library\Validation\Rules\ValidUploadMultiple
+ * @covers Backpack\CRUD\app\Library\Validation\Rules\ValidFileArray
+ * @covers Backpack\CRUD\app\Library\Validation\Rules\Support\HasFiles
*/
-class CrudPanelValidationTest extends BaseDBCrudPanelTest
+class CrudPanelValidationTest extends \Backpack\CRUD\Tests\config\CrudPanel\BaseDBCrudPanel
{
public function testItThrowsValidationExceptions()
{
@@ -37,7 +46,7 @@ public function testItMergesFieldValidationWithRequestValidation()
]);
$request->setRouteResolver(function () use ($request) {
- return (new Route('POST', 'users', ['Backpack\CRUD\Tests\Unit\Http\Controllers\UserCrudController', 'create']))->bind($request);
+ return (new Route('POST', 'users', ['Backpack\CRUD\Tests\Config\Http\Controllers\UserCrudController', 'create']))->bind($request);
});
$this->crudPanel->addFields([
@@ -77,7 +86,7 @@ public function testItMergesAllKindsOfValidation()
]);
$request->setRouteResolver(function () use ($request) {
- return (new Route('POST', 'users', ['Backpack\CRUD\Tests\Unit\Http\Controllers\UserCrudController', 'create']))->bind($request);
+ return (new Route('POST', 'users', ['Backpack\CRUD\Tests\Config\Http\Controllers\UserCrudController', 'create']))->bind($request);
});
$this->crudPanel->addFields([
@@ -117,7 +126,7 @@ public function testItCanGetTheValidationFromFields()
]);
$request->setRouteResolver(function () use ($request) {
- return (new Route('POST', 'users', ['Backpack\CRUD\Tests\Unit\Http\Controllers\UserCrudController', 'create']))->bind($request);
+ return (new Route('POST', 'users', ['Backpack\CRUD\Tests\Config\Http\Controllers\UserCrudController', 'create']))->bind($request);
});
$this->crudPanel->addField([
@@ -161,7 +170,7 @@ public function testItThrowsExceptionWithInvalidValidationClass()
$this->crudPanel->setOperation('create');
try {
- $this->crudPanel->setValidation('\Backpack\CRUD\Tests\Unit\Models\User');
+ $this->crudPanel->setValidation('\Backpack\CRUD\Tests\config\Models\User');
} catch (\Throwable $e) {
}
$this->assertEquals(
@@ -194,7 +203,7 @@ public function testItCanGetTheRequiredFields()
$this->crudPanel->setOperation('create');
$this->assertFalse($this->crudPanel->isRequired('test'));
$this->crudPanel->setValidation([
- 'email' => 'required',
+ 'email' => 'required',
'password.*.test' => 'required',
]);
@@ -204,4 +213,71 @@ public function testItCanGetTheRequiredFields()
$this->assertTrue($this->crudPanel->isRequired('password.test'));
$this->assertTrue($this->crudPanel->isRequired('name'));
}
+
+ public function testItCanGetTheRequiredFieldsFromCustomRules()
+ {
+ $this->crudPanel->setModel(User::class);
+ $this->crudPanel->entry = User::first();
+
+ $this->assertFalse($this->crudPanel->isRequired('test'));
+ $this->crudPanel->setValidation([
+ 'email' => ValidUpload::field('required'),
+ 'password' => ValidUploadMultiple::field('required'),
+ ]);
+
+ $this->crudPanel->setValidation(UserRequest::class);
+ $this->assertEquals(['email', 'password', 'name'], array_values($this->crudPanel->getOperationSetting('requiredFields')));
+ $this->assertTrue($this->crudPanel->isRequired('email'));
+ $this->assertTrue($this->crudPanel->isRequired('password'));
+ $this->assertTrue($this->crudPanel->isRequired('name'));
+ }
+
+ public function testItCanValidateCustomRules()
+ {
+ $this->crudPanel->setModel(User::class);
+ $this->crudPanel->setValidation(UserRequest::class);
+ $this->crudPanel->entry = User::first();
+
+ $pdf1 = UploadedFile::fake()->create('test1.pdf', 1000);
+ $pdf2 = UploadedFile::fake()->create('test2.pdf', 1000);
+
+ $request = request()->create('users/', 'POST', [
+ 'email' => $pdf1,
+ 'password' => [$pdf1, $pdf2],
+ 'name' => 'test',
+ ]);
+
+ $request->setRouteResolver(function () use ($request) {
+ return (new Route('POST', 'users', ['Backpack\CRUD\Tests\Config\Http\Controllers\UserCrudController', 'create']))->bind($request);
+ });
+
+ $this->crudPanel->addFields([
+ [
+ 'name' => 'password',
+ 'validationRules' => ValidUploadMultiple::field('required')->file('file|mimes:pdf|max:500'),
+ ],
+ [
+ 'name' => 'email',
+ 'validationRules' => ValidUpload::field('required')->file('file|mimes:jpg'),
+ ],
+
+ [
+ 'name' => 'name',
+ ],
+ ]);
+
+ $this->crudPanel->setRequest($request);
+
+ $this->expectException(\Illuminate\Validation\ValidationException::class);
+
+ try {
+ $this->crudPanel->validateRequest();
+ } catch (\Illuminate\Validation\ValidationException $e) {
+ $this->assertEquals([
+ 'password' => ['The password field must not be greater than 500 kilobytes.'],
+ 'email' => ['The email field must be a file of type: jpg.'],
+ ], $e->errors());
+ throw $e;
+ }
+ }
}
diff --git a/tests/Unit/CrudPanel/CrudPanelViewsTest.php b/tests/Unit/CrudPanel/CrudPanelViewsTest.php
index 6416dd3f17..478674dc94 100644
--- a/tests/Unit/CrudPanel/CrudPanelViewsTest.php
+++ b/tests/Unit/CrudPanel/CrudPanelViewsTest.php
@@ -2,12 +2,13 @@
namespace Backpack\CRUD\Tests\Unit\CrudPanel;
+use Backpack\CRUD\Tests\config\CrudPanel\BaseCrudPanel;
use Config;
/**
* @covers Backpack\CRUD\app\Library\CrudPanel\Traits\Views
*/
-class CrudPanelViewsTest extends BaseCrudPanelTest
+class CrudPanelViewsTest extends BaseCrudPanel
{
private $customView = 'path/to/custom/view';
private $customContentClass = 'col-md-12';
diff --git a/tests/Unit/CrudPanel/HelpersTest.php b/tests/Unit/CrudPanel/HelpersTest.php
index 297c0b957f..fde48cf6f3 100644
--- a/tests/Unit/CrudPanel/HelpersTest.php
+++ b/tests/Unit/CrudPanel/HelpersTest.php
@@ -2,9 +2,10 @@
namespace Backpack\CRUD\Tests\Unit\CrudPanel;
+use Backpack\CRUD\Tests\config\CrudPanel\BaseCrudPanel;
use Illuminate\Http\Request;
-class HelpersTest extends BaseCrudPanelTest
+class HelpersTest extends BaseCrudPanel
{
public function testBackpackFormInputParsesRepeatableFieldsFunction()
{
diff --git a/tests/Unit/CrudPanel/ViewNamespacesTest.php b/tests/Unit/CrudPanel/ViewNamespacesTest.php
index e4e997971e..b3ffd928b9 100644
--- a/tests/Unit/CrudPanel/ViewNamespacesTest.php
+++ b/tests/Unit/CrudPanel/ViewNamespacesTest.php
@@ -2,13 +2,14 @@
namespace Backpack\CRUD\Tests\Unit\CrudPanel;
+use Backpack\CRUD\Tests\config\CrudPanel\BaseCrudPanel;
use Backpack\CRUD\ViewNamespaces;
use Config;
/**
* @covers Backpack\CRUD\ViewNamespaces
*/
-class ViewNamespacesTest extends BaseCrudPanelTest
+class ViewNamespacesTest extends BaseCrudPanel
{
public function testAddSingleViewNamespace()
{
diff --git a/tests/Unit/CrudTrait/CrudTraitFakeFieldsTest.php b/tests/Unit/CrudTrait/CrudTraitFakeFieldsTest.php
index d54fe998ed..d5bc45ea83 100644
--- a/tests/Unit/CrudTrait/CrudTraitFakeFieldsTest.php
+++ b/tests/Unit/CrudTrait/CrudTraitFakeFieldsTest.php
@@ -2,7 +2,8 @@
namespace Backpack\CRUD\Tests\Unit\CrudTrait;
-use Unit\CrudPanel\Models\FakeColumnsModel;
+use Backpack\CRUD\Tests\config\CrudTrait\BaseCrudTrait;
+use Backpack\CRUD\Tests\config\Models\FakeColumnsModel;
/**
* Class CrudTraitFakeFieldsTest.
@@ -11,7 +12,7 @@
*
* @covers Backpack\CRUD\app\Models\Traits\HasFakeFields
*/
-class CrudTraitFakeFieldsTest extends BaseCrudTraitTest
+class CrudTraitFakeFieldsTest extends BaseCrudTrait
{
private $locale;
/**
diff --git a/tests/Unit/Models/User.php b/tests/Unit/Models/User.php
deleted file mode 100644
index 5ab8828e43..0000000000
--- a/tests/Unit/Models/User.php
+++ /dev/null
@@ -1,114 +0,0 @@
-hasOne('Backpack\CRUD\Tests\Unit\Models\AccountDetails');
- }
-
- /**
- * Get the articles for this user.
- */
- public function articles()
- {
- return $this->hasMany('Backpack\CRUD\Tests\Unit\Models\Article');
- }
-
- /**
- * Get the user roles.
- */
- public function roles()
- {
- return $this->belongsToMany('Backpack\CRUD\Tests\Unit\Models\Role', 'user_role');
- }
-
- public function getNameComposedAttribute()
- {
- return $this->name.'++';
- }
-
- public function comment()
- {
- return $this->morphOne('Backpack\CRUD\Tests\Unit\Models\Comment', 'commentable');
- }
-
- public function recommends()
- {
- return $this->morphToMany('Backpack\CRUD\Tests\Unit\Models\Recommend', 'recommendable')->withPivot('text');
- }
-
- public function bills()
- {
- return $this->morphToMany('Backpack\CRUD\Tests\Unit\Models\Bill', 'billable');
- }
-
- public function stars()
- {
- return $this->morphMany('Backpack\CRUD\Tests\Unit\Models\Star', 'starable');
- }
-
- public function superArticles()
- {
- return $this->belongsToMany('Backpack\CRUD\Tests\Unit\Models\Article', 'articles_user')->withPivot(['notes', 'start_date', 'end_date']);
- }
-
- public function universes()
- {
- return $this->hasMany('Backpack\CRUD\Tests\Unit\Models\Universe');
- }
-
- public function planets()
- {
- return $this->hasMany('Backpack\CRUD\Tests\Unit\Models\Planet');
- }
-
- public function planetsNonNullable()
- {
- return $this->hasMany('Backpack\CRUD\Tests\Unit\Models\PlanetNonNullable');
- }
-
- public function comets()
- {
- return $this->hasMany('Backpack\CRUD\Tests\Unit\Models\Comet');
- }
-
- public function bang()
- {
- return $this->belongsTo('Backpack\CRUD\Tests\Unit\Models\Bang', 'bang_relation_field');
- }
-
- public function incomes()
- {
- return $this->hasMany('Backpack\CRUD\Tests\Unit\Models\Transaction')->ofType('income');
- }
-
- public function expenses()
- {
- return $this->hasMany('Backpack\CRUD\Tests\Unit\Models\Transaction')->ofType('expense');
- }
-
- protected function isNotRelation()
- {
- return false;
- }
-
- public function isNotRelationPublic($arg)
- {
- return false;
- }
-}
diff --git a/tests/Unit/CrudPanel/BaseCrudPanelTest.php b/tests/config/CrudPanel/BaseCrudPanel.php
similarity index 74%
rename from tests/Unit/CrudPanel/BaseCrudPanelTest.php
rename to tests/config/CrudPanel/BaseCrudPanel.php
index 73022b765a..b167a199f7 100644
--- a/tests/Unit/CrudPanel/BaseCrudPanelTest.php
+++ b/tests/config/CrudPanel/BaseCrudPanel.php
@@ -1,12 +1,12 @@
loadMigrationsFrom([
'--database' => 'testing',
- '--path' => realpath(__DIR__.'/../../config/database/migrations'),
+ '--path' => realpath(__DIR__.'/../../config/database/migrations'),
]);
- $this->artisan('db:seed', ['--class' => 'Backpack\CRUD\Tests\Config\Database\Seeds\UsersRolesTableSeeder']);
- $this->artisan('db:seed', ['--class' => 'Backpack\CRUD\Tests\Config\Database\Seeds\UsersTableSeeder']);
- $this->artisan('db:seed', ['--class' => 'Backpack\CRUD\Tests\Config\Database\Seeds\ArticlesTableSeeder']);
- $this->artisan('db:seed', ['--class' => 'Backpack\CRUD\Tests\Config\Database\Seeds\MorphableSeeders']);
+ $this->seed('Backpack\CRUD\Tests\config\database\seeds\UsersRolesTableSeeder');
+ $this->seed('Backpack\CRUD\Tests\config\database\seeds\UsersTableSeeder');
+ $this->seed('Backpack\CRUD\Tests\config\database\seeds\ArticlesTableSeeder');
+ $this->seed('Backpack\CRUD\Tests\config\database\seeds\MorphableSeeders');
}
/**
diff --git a/tests/Unit/CrudPanel/BasePrefixedDBCrudPanelTest.php b/tests/config/CrudPanel/BasePrefixedDBCrudPanel.php
similarity index 91%
rename from tests/Unit/CrudPanel/BasePrefixedDBCrudPanelTest.php
rename to tests/config/CrudPanel/BasePrefixedDBCrudPanel.php
index 7edd2d47c6..2a50967fa0 100644
--- a/tests/Unit/CrudPanel/BasePrefixedDBCrudPanelTest.php
+++ b/tests/config/CrudPanel/BasePrefixedDBCrudPanel.php
@@ -1,12 +1,12 @@
loadMigrationsFrom([
'--database' => 'testing',
- '--path' => realpath(__DIR__.'/../../config/database/migrations'),
+ '--path' => realpath(__DIR__.'/../../config/database/migrations'),
]);
$this->artisan('db:seed', ['--class' => 'Backpack\CRUD\Tests\Config\Database\Seeds\UsersRolesTableSeeder']);
diff --git a/tests/Unit/CrudTrait/BaseCrudTraitTest.php b/tests/config/CrudTrait/BaseCrudTrait.php
similarity index 63%
rename from tests/Unit/CrudTrait/BaseCrudTraitTest.php
rename to tests/config/CrudTrait/BaseCrudTrait.php
index 66024de960..764323cfae 100644
--- a/tests/Unit/CrudTrait/BaseCrudTraitTest.php
+++ b/tests/config/CrudTrait/BaseCrudTrait.php
@@ -1,10 +1,10 @@
belongsTo('Backpack\CRUD\Tests\Unit\Models\User');
+ return $this->belongsTo('Backpack\CRUD\Tests\config\Models\User');
}
public function addresses()
{
- return $this->hasMany('Backpack\CRUD\Tests\Unit\Models\Address');
+ return $this->hasMany('Backpack\CRUD\Tests\config\Models\Address');
}
public function getNicknameComposedAttribute()
@@ -32,16 +32,16 @@ public function getNicknameComposedAttribute()
public function article()
{
- return $this->belongsTo('Backpack\CRUD\Tests\Unit\Models\Article');
+ return $this->belongsTo('Backpack\CRUD\Tests\config\Models\Article');
}
public function bangs()
{
- return $this->belongsToMany('Backpack\CRUD\Tests\Unit\Models\Bang');
+ return $this->belongsToMany('Backpack\CRUD\Tests\config\Models\Bang');
}
public function bangsPivot()
{
- return $this->belongsToMany('Backpack\CRUD\Tests\Unit\Models\Bang', 'account_details_bangs_pivot')->withPivot('pivot_field');
+ return $this->belongsToMany('Backpack\CRUD\Tests\config\Models\Bang', 'account_details_bangs_pivot')->withPivot('pivot_field');
}
}
diff --git a/tests/Unit/Models/Address.php b/tests/config/Models/Address.php
similarity index 62%
rename from tests/Unit/Models/Address.php
rename to tests/config/Models/Address.php
index 5d2eecc2a9..b5b1b5ca2e 100644
--- a/tests/Unit/Models/Address.php
+++ b/tests/config/Models/Address.php
@@ -1,6 +1,6 @@
belongsTo('Backpack\CRUD\Tests\Unit\Models\AccountDetails', 'account_details_id');
+ return $this->belongsTo('Backpack\CRUD\Tests\config\Models\AccountDetails', 'account_details_id');
}
public function bang()
{
- return $this->belongsTo('Backpack\CRUD\Tests\Unit\Models\Bang', 'city');
+ return $this->belongsTo('Backpack\CRUD\Tests\config\Models\Bang', 'city');
}
}
diff --git a/tests/Unit/Models/Article.php b/tests/config/Models/Article.php
similarity index 84%
rename from tests/Unit/Models/Article.php
rename to tests/config/Models/Article.php
index 27e4860adf..195425789c 100644
--- a/tests/Unit/Models/Article.php
+++ b/tests/config/Models/Article.php
@@ -1,6 +1,6 @@
belongsTo('Backpack\CRUD\Tests\Unit\Models\User');
+ return $this->belongsTo('Backpack\CRUD\Tests\config\Models\User');
}
public function getContentComposedAttribute()
diff --git a/tests81/Unit/Models/ArticleWithEnum.php b/tests/config/Models/ArticleWithEnum.php
similarity index 70%
rename from tests81/Unit/Models/ArticleWithEnum.php
rename to tests/config/Models/ArticleWithEnum.php
index 3c3f4885a0..1713d26f8f 100644
--- a/tests81/Unit/Models/ArticleWithEnum.php
+++ b/tests/config/Models/ArticleWithEnum.php
@@ -1,11 +1,11 @@
belongsTo('Backpack\CRUD\Tests\Unit\Models\User');
+ return $this->belongsTo('Backpack\CRUD\Tests\config\Models\User');
}
}
diff --git a/tests/Unit/Models/Bang.php b/tests/config/Models/Bang.php
similarity index 91%
rename from tests/Unit/Models/Bang.php
rename to tests/config/Models/Bang.php
index 81cacb53b4..bc0c7e1438 100644
--- a/tests/Unit/Models/Bang.php
+++ b/tests/config/Models/Bang.php
@@ -1,6 +1,6 @@
belongsToMany('Backpack\CRUD\Tests\Unit\Models\AccountDetails');
+ return $this->belongsToMany('Backpack\CRUD\Tests\config\Models\AccountDetails');
}
/*
diff --git a/tests/Unit/Models/Bill.php b/tests/config/Models/Bill.php
similarity index 97%
rename from tests/Unit/Models/Bill.php
rename to tests/config/Models/Bill.php
index 51e91d23d2..f097bbf515 100644
--- a/tests/Unit/Models/Bill.php
+++ b/tests/config/Models/Bill.php
@@ -1,6 +1,6 @@
belongsTo('Backpack\CRUD\Tests\Unit\Models\User');
+ return $this->belongsTo('Backpack\CRUD\Tests\config\Models\User');
}
/*
diff --git a/tests/Unit/Models/Comment.php b/tests/config/Models/Comment.php
similarity index 97%
rename from tests/Unit/Models/Comment.php
rename to tests/config/Models/Comment.php
index affa80e241..a1bc28cf5a 100644
--- a/tests/Unit/Models/Comment.php
+++ b/tests/config/Models/Comment.php
@@ -1,6 +1,6 @@
belongsTo('Backpack\CRUD\Tests\Unit\Models\User');
+ return $this->belongsTo('Backpack\CRUD\Tests\config\Models\User');
}
/*
diff --git a/tests/Unit/Models/PlanetNonNullable.php b/tests/config/Models/PlanetNonNullable.php
similarity index 92%
rename from tests/Unit/Models/PlanetNonNullable.php
rename to tests/config/Models/PlanetNonNullable.php
index 695ead4def..83737f3087 100644
--- a/tests/Unit/Models/PlanetNonNullable.php
+++ b/tests/config/Models/PlanetNonNullable.php
@@ -1,6 +1,6 @@
belongsTo('Backpack\CRUD\Tests\Unit\Models\User');
+ return $this->belongsTo('Backpack\CRUD\Tests\config\Models\User');
}
/*
diff --git a/tests/Unit/Models/Recommend.php b/tests/config/Models/Recommend.php
similarity index 86%
rename from tests/Unit/Models/Recommend.php
rename to tests/config/Models/Recommend.php
index c2c838c397..d55a411205 100644
--- a/tests/Unit/Models/Recommend.php
+++ b/tests/config/Models/Recommend.php
@@ -1,6 +1,6 @@
morphedByMany('Backpack\CRUD\Tests\Unit\Models\User', 'recommendable');
+ return $this->morphedByMany('Backpack\CRUD\Tests\config\Models\User', 'recommendable');
}
public function articles()
{
- return $this->morphedByMany('Backpack\CRUD\Tests\Unit\Models\Article', 'recommendable');
+ return $this->morphedByMany('Backpack\CRUD\Tests\config\Models\Article', 'recommendable');
}
/*
diff --git a/tests/Unit/Models/Role.php b/tests/config/Models/Role.php
similarity index 74%
rename from tests/Unit/Models/Role.php
rename to tests/config/Models/Role.php
index 44fbfdea39..8352ec93c0 100644
--- a/tests/Unit/Models/Role.php
+++ b/tests/config/Models/Role.php
@@ -1,6 +1,6 @@
belongsToMany('Backpack\CRUD\Tests\Unit\Models\User', 'user_role');
+ return $this->belongsToMany('Backpack\CRUD\Tests\config\Models\User', 'user_role');
}
public function getRoleNameAttribute()
diff --git a/tests/Unit/Models/Star.php b/tests/config/Models/Star.php
similarity index 97%
rename from tests/Unit/Models/Star.php
rename to tests/config/Models/Star.php
index 13b11df307..bfd12c165e 100644
--- a/tests/Unit/Models/Star.php
+++ b/tests/config/Models/Star.php
@@ -1,6 +1,6 @@
belongsTo('Backpack\CRUD\Tests\Unit\Models\User');
+ return $this->belongsTo('Backpack\CRUD\Tests\config\Models\User');
}
/*
diff --git a/tests/Unit/Models/Universe.php b/tests/config/Models/Universe.php
similarity index 92%
rename from tests/Unit/Models/Universe.php
rename to tests/config/Models/Universe.php
index 044bb6450a..c25235351f 100644
--- a/tests/Unit/Models/Universe.php
+++ b/tests/config/Models/Universe.php
@@ -1,6 +1,6 @@
belongsTo('Backpack\CRUD\Tests\Unit\Models\User');
+ return $this->belongsTo('Backpack\CRUD\Tests\config\Models\User');
}
/*
diff --git a/tests/config/Models/User.php b/tests/config/Models/User.php
new file mode 100644
index 0000000000..dc9532b177
--- /dev/null
+++ b/tests/config/Models/User.php
@@ -0,0 +1,114 @@
+hasOne('Backpack\CRUD\Tests\config\Models\AccountDetails');
+ }
+
+ /**
+ * Get the articles for this user.
+ */
+ public function articles()
+ {
+ return $this->hasMany('Backpack\CRUD\Tests\config\Models\Article');
+ }
+
+ /**
+ * Get the user roles.
+ */
+ public function roles()
+ {
+ return $this->belongsToMany('Backpack\CRUD\Tests\config\Models\Role', 'user_role');
+ }
+
+ public function getNameComposedAttribute()
+ {
+ return $this->name.'++';
+ }
+
+ public function comment()
+ {
+ return $this->morphOne('Backpack\CRUD\Tests\config\Models\Comment', 'commentable');
+ }
+
+ public function recommends()
+ {
+ return $this->morphToMany('Backpack\CRUD\Tests\config\Models\Recommend', 'recommendable')->withPivot('text');
+ }
+
+ public function bills()
+ {
+ return $this->morphToMany('Backpack\CRUD\Tests\config\Models\Bill', 'billable');
+ }
+
+ public function stars()
+ {
+ return $this->morphMany('Backpack\CRUD\Tests\config\Models\Star', 'starable');
+ }
+
+ public function superArticles()
+ {
+ return $this->belongsToMany('Backpack\CRUD\Tests\config\Models\Article', 'articles_user')->withPivot(['notes', 'start_date', 'end_date']);
+ }
+
+ public function universes()
+ {
+ return $this->hasMany('Backpack\CRUD\Tests\config\Models\Universe');
+ }
+
+ public function planets()
+ {
+ return $this->hasMany('Backpack\CRUD\Tests\config\Models\Planet');
+ }
+
+ public function planetsNonNullable()
+ {
+ return $this->hasMany('Backpack\CRUD\Tests\config\Models\PlanetNonNullable');
+ }
+
+ public function comets()
+ {
+ return $this->hasMany('Backpack\CRUD\Tests\config\Models\Comet');
+ }
+
+ public function bang()
+ {
+ return $this->belongsTo('Backpack\CRUD\Tests\config\Models\Bang', 'bang_relation_field');
+ }
+
+ public function incomes()
+ {
+ return $this->hasMany('Backpack\CRUD\Tests\config\Models\Transaction')->ofType('income');
+ }
+
+ public function expenses()
+ {
+ return $this->hasMany('Backpack\CRUD\Tests\config\Models\Transaction')->ofType('expense');
+ }
+
+ protected function isNotRelation()
+ {
+ return false;
+ }
+
+ public function isNotRelationPublic($arg)
+ {
+ return false;
+ }
+}
diff --git a/tests81/Unit/Models/UserWithReturnTypes.php b/tests/config/Models/UserWithReturnTypes.php
similarity index 68%
rename from tests81/Unit/Models/UserWithReturnTypes.php
rename to tests/config/Models/UserWithReturnTypes.php
index 7f12fd7be3..40ad07c66c 100644
--- a/tests81/Unit/Models/UserWithReturnTypes.php
+++ b/tests/config/Models/UserWithReturnTypes.php
@@ -1,8 +1,8 @@
crudPanel->setModel(\Backpack\CRUD\Tests81\Unit\Models\UserWithReturnTypes::class);
- $this->crudPanel->addField('isAnAttribute');
- $this->crudPanel->addField('isARelation');
-
- $this->assertEquals(false, $this->crudPanel->fields()['isAnAttribute']['entity']);
- $this->assertEquals('isARelation', $this->crudPanel->fields()['isARelation']['entity']);
- }
-}
diff --git a/tests81/Unit/CrudPanel/CrudPanelUpdateTest.php b/tests81/Unit/CrudPanel/CrudPanelUpdateTest.php
deleted file mode 100644
index 6bc0676415..0000000000
--- a/tests81/Unit/CrudPanel/CrudPanelUpdateTest.php
+++ /dev/null
@@ -1,66 +0,0 @@
-version() < 9) {
- return;
- }
-
- $this->crudPanel->setModel(\Backpack\CRUD\Tests81\Unit\Models\ArticleWithEnum::class);
- $this->crudPanel->addFields([[
- 'name' => 'id',
- 'type' => 'hidden',
- ], [
- 'name' => 'content',
- ], [
- 'name' => 'tags',
- ], [
- 'label' => 'Author',
- 'type' => 'select',
- 'name' => 'user_id',
- 'entity' => 'user',
- 'attribute' => 'name',
- ], [
- 'name' => 'status',
- ],
- [
- 'name' => 'state',
- ],
- [
- 'name' => 'style',
- ],
- ]);
- $faker = Factory::create();
- $inputData = [
- 'content' => $faker->text(),
- 'tags' => $faker->words(3, true),
- 'user_id' => 1,
- 'metas' => null,
- 'extras' => null,
- 'status' => 'publish',
- 'state' => 'COLD',
- 'style' => 'DRAFT',
- 'cast_metas' => null,
- 'cast_tags' => null,
- 'cast_extras' => null,
- ];
- $article = $this->crudPanel->create($inputData);
-
- $updateFields = $this->crudPanel->getUpdateFields(2);
-
- $this->assertTrue($updateFields['status']['value']->value === 'publish');
- $this->assertTrue($updateFields['status']['value']->name === 'PUBLISHED');
- $this->assertTrue($updateFields['state']['value']->name === 'COLD');
- $this->assertTrue($updateFields['style']['value']->color() === 'red');
- }
-}
diff --git a/webpack.mix.js b/webpack.mix.js
deleted file mode 100644
index dad1488ed6..0000000000
--- a/webpack.mix.js
+++ /dev/null
@@ -1,83 +0,0 @@
-const mix = require('laravel-mix');
-
-/*
- |--------------------------------------------------------------------------
- | Mix Asset Management
- |--------------------------------------------------------------------------
- |
- | Backpack maintainers use mix to:
- | - install and update CSS and JS assets;
- | - copy everything that needs to be published into src/public
- |
- | All JS will be bundled into one file (see bundle.js).
- |
- | How to use (for maintainers only):
- | - cd vendor/backpack/crud
- | - npm install
- | - npm run prod
- | (this will also publish the assets for you to test, so no need to do that too)
- */
-
-// merge all needed JS into a big bundle file
-mix.js('src/resources/assets/js/bundle.js', 'src/public/packages/backpack/base/js/');
-
-// merge all needed CSS into a big bundle file
-mix.sass('src/resources/assets/scss/bundle.scss', 'src/public/packages/backpack/base/css/')
- .options({
- processCssUrls: false
- });
-
-// merge all needed CSS into a big bundle file (this time with a blue primary color)
-mix.sass('src/resources/assets/scss/blue-bundle.scss', 'src/public/packages/backpack/base/css/')
- .options({
- processCssUrls: false
- });
-
-// copy the Backstrap CSS
-mix.copy('node_modules/@digitallyhappy/backstrap/dist/css', 'src/public/packages/@digitallyhappy/backstrap/css');
-
-// copy fonts and other assets
-mix.copy('node_modules/line-awesome/dist/line-awesome', 'src/public/packages/line-awesome')
- .copy('node_modules/source-sans-pro', 'src/public/packages/source-sans-pro')
- .copy('node_modules/animate.css/animate.min.css', 'src/public/packages/animate.css/animate.min.css')
- .copy('node_modules/animate.css/animate.compat.css', 'src/public/packages/animate.css/animate.compat.css')
- .copy('node_modules/noty/lib', 'src/public/packages/noty');
-
-
-// copy CRUD filters JS into packages
-mix.copy('node_modules/bootstrap-datepicker/dist', 'src/public/packages/bootstrap-datepicker/dist')
- .copy('node_modules/moment/min', 'src/public/packages/moment/min')
- .copy('node_modules/select2/dist', 'src/public/packages/select2/dist')
- .copy('node_modules/jquery-colorbox', 'src/public/packages/jquery-colorbox')
- .copy('node_modules/jquery-ui-dist', 'src/public/packages/jquery-ui-dist')
- .copy('node_modules/select2-bootstrap-theme/dist', 'src/public/packages/select2-bootstrap-theme/dist')
- .copy('node_modules/bootstrap-daterangepicker/daterangepicker.css', 'src/public/packages/bootstrap-daterangepicker/daterangepicker.css')
- .copy('node_modules/bootstrap-daterangepicker/daterangepicker.js', 'src/public/packages/bootstrap-daterangepicker/daterangepicker.js')
- .copy('node_modules/pc-bootstrap4-datetimepicker/build', 'src/public/packages/pc-bootstrap4-datetimepicker/build')
- .copy('node_modules/cropperjs/dist', 'src/public/packages/cropperjs/dist')
- .copy('node_modules/jquery-cropper/dist', 'src/public/packages/jquery-cropper/dist')
- // note that we change the directory name here;
- // see https://github.com/Laravel-Backpack/CRUD/issues/3883 for details
- .copy('node_modules/ckeditor4', 'src/public/packages/ckeditor')
- .copy('node_modules/bootstrap-colorpicker/dist', 'src/public/packages/bootstrap-colorpicker/dist')
- .copy('node_modules/bootstrap-iconpicker/bootstrap-iconpicker', 'src/public/packages/bootstrap-iconpicker/bootstrap-iconpicker')
- .copy('node_modules/bootstrap-iconpicker/icon-fonts', 'src/public/packages/bootstrap-iconpicker/icon-fonts')
- .copy('node_modules/easymde/dist', 'src/public/packages/easymde/dist')
- .copy('node_modules/summernote/dist', 'src/public/packages/summernote/dist')
- .copy('node_modules/tinymce', 'src/public/packages/tinymce')
- .copy('node_modules/nestedSortable', 'src/public/packages/nestedSortable')
- .copy('node_modules/datatables.net', 'src/public/packages/datatables.net')
- .copy('node_modules/datatables.net-bs4', 'src/public/packages/datatables.net-bs4')
- .copy('node_modules/datatables.net-fixedheader', 'src/public/packages/datatables.net-fixedheader')
- .copy('node_modules/datatables.net-fixedheader-bs4', 'src/public/packages/datatables.net-fixedheader-bs4')
- .copy('node_modules/datatables.net-responsive', 'src/public/packages/datatables.net-responsive')
- .copy('node_modules/datatables.net-responsive-bs4', 'src/public/packages/datatables.net-responsive-bs4')
- .copy('node_modules/places.js/dist', 'src/public/packages/places.js/dist')
- .copy('node_modules/jquery-ui-touch-punch/jquery.ui.touch-punch.min.js', 'src/public/packages/jquery-ui-touch-punch/jquery.ui.touch-punch.min.js')
- .copy('node_modules/urijs/src/URI.min.js', 'src/public/packages/URI.js/URI.min.js')
- .copy('node_modules/intl-tel-input/build', 'src/public/packages/intl-tel-input/build');
-
-// FOR MAINTAINERS
-// copy asset files from Base's public folder the main app's public folder
-// so that you don't have to publish the assets with artisan to test them
-mix.copyDirectory('src/public', '../../../public')