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