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