Skip to content

Commit 27e8c06

Browse files
promatiktabacitu
andauthored
Moved page-or-link field from CRUD to PageManager (#67)
* page_or_link moved to PageManager package * Revert test with fake column * Moved page_or_link to MenuCRUD * moved page_or_link field outside the vendor/backpack/crud wormhole Co-authored-by: Cristian Tabacitu <cristian.tabacitu@digitallyhappy.com>
1 parent 8573ad8 commit 27e8c06

File tree

3 files changed

+166
-0
lines changed

3 files changed

+166
-0
lines changed

src/MenuCRUDServiceProvider.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,12 @@ class MenuCRUDServiceProvider extends ServiceProvider
2828
*/
2929
public function boot()
3030
{
31+
// publish views
32+
$this->publishes([__DIR__.'/resources/views' => base_path('resources/views/vendor/backpack/crud')], 'views');
3133
// publish migrations
3234
$this->publishes([__DIR__.'/database/migrations' => database_path('migrations')], 'migrations');
35+
36+
$this->loadViewsFrom(realpath(__DIR__.'/resources/views'), 'menucrud');
3337
}
3438

3539
/**

src/app/Http/Controllers/Admin/MenuItemCrudController.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ public function setup()
5353
'label' => 'Type',
5454
'type' => 'page_or_link',
5555
'page_model' => '\Backpack\PageManager\app\Models\Page',
56+
'view_namespace' => file_exists(resource_path('views/vendor/backpack/crud/fields/page_or_link.blade.php')) ? null : 'menucrud::fields',
5657
]);
5758
});
5859
}
Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
{{-- PAGE OR LINK field --}}
2+
{{-- Used in Backpack\MenuCRUD --}}
3+
4+
<?php
5+
$field['allows_null'] = $field['allows_null'] ?? false;
6+
7+
$field['name']['type'] = $field['name']['type'] ?? $field['name'][0] ?? 'type';
8+
$field['name']['link'] = $field['name']['link'] ?? $field['name'][1] ?? 'link';
9+
$field['name']['page_id'] = $field['name']['page_id'] ?? $field['name'][2] ?? 'page_id';
10+
11+
$field['options']['page_link'] = $field['options']['page_link'] ?? trans('backpack::crud.page_link');
12+
$field['options']['internal_link'] = $field['options']['internal_link'] ?? trans('backpack::crud.internal_link');
13+
$field['options']['external_link'] = $field['options']['external_link'] ?? trans('backpack::crud.external_link');
14+
15+
$field['pages'] = $field['pages'] ?? ($field['page_model'] ?? config('backpack.pagemanager.page_model_class'))::all();
16+
?>
17+
18+
@include('crud::fields.inc.wrapper_start')
19+
<label>{!! $field['label'] !!}</label>
20+
@include('crud::fields.inc.translatable_icon')
21+
22+
<div class="row" data-init-function="bpFieldInitPageOrLinkElement">
23+
{{-- hidden placeholders for content --}}
24+
<input type="hidden" value="{{ $entry->{$field['name']['page_id']} ?? '' }}" name="{{ $field['name']['page_id'] }}" />
25+
<input type="hidden" value="{{ $entry->{$field['name']['link']} ?? '' }}" name="{{ $field['name']['link'] }}" />
26+
27+
<div class="col-sm-3">
28+
{{-- type select --}}
29+
<select
30+
data-identifier="page_or_link_select"
31+
name="{!! $field['name']['type'] !!}"
32+
@include('crud::fields.inc.attributes')
33+
>
34+
35+
@if ($field['allows_null'])
36+
<option value="">-</option>
37+
@endif
38+
39+
@foreach ($field['options'] as $key => $value)
40+
<option value="{{ $key }}"
41+
@if (isset($entry) && $key === $entry->{$field['name']['type']})
42+
selected
43+
@endif
44+
>{{ $value }}</option>
45+
@endforeach
46+
</select>
47+
</div>
48+
<div class="col-sm-9">
49+
{{-- page slug input --}}
50+
<div class="page_or_link_value page_link {{ (isset($entry) && $entry->{$field['name']['type']} === 'page_link') || (isset($entry) && !$entry->{$field['name']['type']} && !$field['allows_null']) || (!isset($entry) && !$field['allows_null']) ? '' : 'd-none' }}">
51+
<select
52+
class="form-control"
53+
for="{{ $field['name']['page_id'] }}"
54+
required
55+
>
56+
@foreach ($field['pages'] as $page)
57+
<option value="{{ $page->id }}"
58+
@if (isset($entry) && $page->id === $entry->{$field['name']['page_id']})
59+
selected
60+
@endif
61+
>{{ $page->name }}</option>
62+
@endforeach
63+
</select>
64+
</div>
65+
66+
{{-- internal link input --}}
67+
<div class="page_or_link_value internal_link {{ isset($entry) && $entry->{$field['name']['type']} === 'internal_link' ? '' : 'd-none' }}">
68+
<input
69+
type="text"
70+
class="form-control"
71+
placeholder="{{ trans('backpack::crud.internal_link_placeholder', ['url', url(config('backpack.base.route_prefix').'/page')]) }}"
72+
for="{{ $field['name']['link'] }}"
73+
required
74+
75+
@if (isset($entry) && $entry->{$field['name']['type']} !== 'internal_link')
76+
disabled="disabled"
77+
@endif
78+
79+
@if (isset($entry) && $entry->{$field['name']['type']} === 'internal_link' && $entry->{$field['name']['link']})
80+
value="{{ $entry->{$field['name']['link']} }}"
81+
@endif
82+
>
83+
</div>
84+
85+
{{-- external link input --}}
86+
<div class="page_or_link_value external_link {{ isset($entry) && $entry->{$field['name']['type']} === 'external_link' ? '' : 'd-none' }}">
87+
<input
88+
type="url"
89+
class="form-control"
90+
placeholder="{{ trans('backpack::crud.page_link_placeholder') }}"
91+
for="{{ $field['name']['link'] }}"
92+
required
93+
94+
@if (isset($entry) && $entry->{$field['name']['type']} !== 'external_link')
95+
disabled="disabled"
96+
@endif
97+
98+
@if (isset($entry) && $entry->{$field['name']['type']} === 'external_link' && $entry->{$field['name']['link']})
99+
value="{{ $entry->{$field['name']['link']} }}"
100+
@endif
101+
>
102+
</div>
103+
</div>
104+
</div>
105+
106+
{{-- HINT --}}
107+
@if (isset($field['hint']))
108+
<p class="help-block">{!! $field['hint'] !!}</p>
109+
@endif
110+
111+
@include('crud::fields.inc.wrapper_end')
112+
113+
114+
{{-- ########################################## --}}
115+
{{-- Extra CSS and JS for this particular field --}}
116+
{{-- If a field type is shown multiple times on a form, the CSS and JS will only be loaded once --}}
117+
@if ($crud->fieldTypeNotLoaded($field))
118+
@php
119+
$crud->markFieldTypeAsLoaded($field);
120+
@endphp
121+
122+
{{-- FIELD JS - will be loaded in the after_scripts section --}}
123+
@push('crud_fields_scripts')
124+
<script>
125+
function bpFieldInitPageOrLinkElement(element) {
126+
element = element[0]; // jQuery > Vanilla
127+
128+
const select = element.querySelector('select[data-identifier=page_or_link_select]');
129+
const values = element.querySelectorAll('.page_or_link_value');
130+
131+
// updates hidden fields
132+
const updateHidden = () => {
133+
let selectedInput = select.value && element.querySelector(`.${select.value}`).firstElementChild;
134+
element.querySelectorAll(`input[type="hidden"]`).forEach(hidden => {
135+
hidden.value = selectedInput && hidden.getAttribute('name') === selectedInput.getAttribute('for') ? selectedInput.value : '';
136+
});
137+
}
138+
139+
// save input changes to hidden placeholders
140+
values.forEach(value => value.firstElementChild.addEventListener('input', updateHidden));
141+
142+
// main select change
143+
select.addEventListener('change', () => {
144+
values.forEach(value => {
145+
let isSelected = value.classList.contains(select.value);
146+
147+
// toggle visibility and disabled
148+
value.classList.toggle('d-none', !isSelected);
149+
value.firstElementChild.toggleAttribute('disabled', !isSelected);
150+
});
151+
152+
// updates hidden fields
153+
updateHidden();
154+
});
155+
}
156+
</script>
157+
@endpush
158+
159+
@endif
160+
{{-- End of Extra CSS and JS --}}
161+
{{-- ########################################## --}}

0 commit comments

Comments
 (0)