PluginProbe
Adminify – White Label, Admin Menu Editor, Login Customizer / 4.0.7
Adminify – White Label, Admin Menu Editor, Login Customizer v4.0.7
4.3.1 4.3.0 4.2.26 4.2.25 4.2.24 4.2.23 4.2.22 4.2.21 4.2.20 4.2.19 4.2.18 4.2.17 4.2.16 4.2.15 4.2.14 4.2.13 4.2.12 4.2.11 4.2.10 4.2.9 4.2.8 4.2.7 4.2.6 4.2.5 4.1.17 All 164 releases
adminify / Inc / Modules / MenuEditor / MenuEditor.php

MenuEditor.php in Adminify – White Label, Admin Menu Editor, Login Customizer 4.0.7, at Inc/Modules/MenuEditor/MenuEditor.php

1,858 lines 79.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace WPAdminify\Inc\Modules\MenuEditor;
4
5 use WPAdminify\Inc\Utils;
6 use WPAdminify\Inc\Admin\AdminSettings;
7 use WPAdminify\Inc\Modules\MenuEditor\MenuEditorAssets;
8 use WPAdminify\Inc\Admin\AdminSettingsModel;
9 use enshrined\svgSanitize\Sanitizer;
10 // no direct access allowed
11 if ( !defined( 'ABSPATH' ) ) {
12 exit;
13 }
14 /**
15 * WP Adminify
16 *
17 * @package WP Adminify: Menu Editor
18 *
19 * @author WP Adminify <support@wpadminify.com>
20 */
21 if ( !class_exists( 'MenuEditor' ) ) {
22 class MenuEditor extends MenuEditorModel {
23 public $url;
24
25 public $menu;
26
27 public $users;
28
29 public $roles;
30
31 public $submenu;
32
33 public $options = [];
34
35 public $menu_settings = [];
36
37 public static $instance;
38
39 public static function get_instance() {
40 if ( self::$instance === null ) {
41 self::$instance = new self();
42 }
43 return self::$instance;
44 }
45
46 public function __construct() {
47 $this->menu_settings = ( new MenuEditorOptions() )->get();
48 $this->options = (array) AdminSettings::get_instance()->get();
49 add_filter( 'upload_mimes', [$this, 'custom_icon_mime_types'] );
50 add_filter( 'wp_handle_upload_prefilter', [$this, 'sanitize_svg_file'] );
51 add_filter( 'admin_body_class', [$this, 'jltwp_adminify_menu_editor_body_class'] );
52 // add_filter('parent_file', [$this, 'set_menu'], 800);
53 // add_filter('parent_file', [$this, 'apply_menu'], 900);
54 // add_action('jltwp_adminify_modules_menu_editor_render', [$this, 'jltwp_adminify_modules_menu_editor_render']);
55 if ( apply_filters( 'enable_jltwp_adminify_menu_editor_render', true ) ) {
56 add_filter( 'parent_file', [$this, 'set_menu'], 800 );
57 add_filter( 'parent_file', [$this, 'apply_menu'], 900 );
58 }
59 add_action( 'wp_ajax_adminify_save_menu_settings', [$this, 'adminify_save_menu_settings'] );
60 add_action( 'wp_ajax_adminify_reset_menu_settings', [$this, 'adminify_reset_menu_settings'] );
61 add_action( 'wp_ajax_adminify_export_menu_settings', [$this, 'adminify_export_menu_settings'] );
62 add_action( 'wp_ajax_adminify_import_menu_settings', [$this, 'adminify_import_menu_settings'] );
63 add_action( 'wp_ajax_adminify_file_upload', [$this, 'adminify_file_upload_callback'] );
64 add_action( 'wp_ajax_adminify_load_custom_icons', [$this, 'adminify_load_custom_icons_callback'] );
65 new MenuEditorAssets();
66 }
67
68 public function custom_icon_mime_types( $mimes ) {
69 if ( current_user_can( 'administrator' ) ) {
70 $mimes['svg'] = 'image/svg+xml';
71 }
72 return $mimes;
73 }
74
75 public function sanitize_svg_file( $file ) {
76 // Step 1: Validate File Type
77 $file_type = wp_check_filetype( $file['name'] );
78 // Ensure the file is an SVG
79 if ( $file_type['ext'] === 'svg' ) {
80 // Read the contents of the SVG file
81 $file_contents = file_get_contents( $file['tmp_name'] );
82 // Validate if it's an actual SVG by checking if it contains the <svg> tag
83 if ( strpos( $file_contents, '<svg' ) === false ) {
84 $file['error'] = 'Invalid SVG file';
85 return $file;
86 // Stop further processing if it's not a valid SVG
87 }
88 // Step 2: Sanitize the SVG File
89 $sanitizer = new Sanitizer();
90 $clean_svg = $sanitizer->sanitize( $file_contents );
91 if ( $clean_svg ) {
92 // Save the sanitized SVG back to the file
93 file_put_contents( $file['tmp_name'], $clean_svg );
94 } else {
95 $file['error'] = 'Failed to sanitize the SVG file';
96 }
97 }
98 return $file;
99 }
100
101 public function filter_attachment( $value ) {
102 // return $value->post_title == 'adminify-custom-icon';
103 return strpos( $value->guid, 'adminify-custom-icon' ) !== false;
104 }
105
106 public function adminify_load_custom_icons_callback() {
107 // Security check - verify nonce and capability
108 check_ajax_referer( 'adminify-menu-editor-security-nonce', 'security' );
109 if ( !current_user_can( 'manage_options' ) ) {
110 wp_send_json_error( array(
111 'message' => __( 'You do not have permission to perform this action.', 'adminify' ),
112 ) );
113 }
114 $result['images'] = null;
115 $query = get_posts( [
116 'post_type' => 'attachment',
117 'numberposts' => -1,
118 ] );
119 $filtered = array_filter( $query, [$this, 'filter_attachment'] );
120 foreach ( $filtered as $key => $value ) {
121 $result['images'][$value->ID] = $value->guid;
122 }
123 echo wp_json_encode( $result );
124 die;
125 }
126
127 public function adminify_file_upload_callback() {
128 $result['status'] = false;
129 check_ajax_referer( 'adminify-menu-editor-security-nonce', 'security' );
130 if ( !current_user_can( 'manage_options' ) ) {
131 wp_send_json_error( array(
132 'message' => __( 'You do not have permission to perform this action.', 'adminify' ),
133 ) );
134 }
135 $upload_dir = wp_upload_dir();
136 $targeted_dir = $upload_dir['basedir'] . '/adminify-custom-icons';
137 if ( !is_dir( $targeted_dir ) ) {
138 wp_mkdir_p( $targeted_dir );
139 }
140 add_filter( 'upload_dir', [$this, 'adminify_icon_custom_upload_dir'] );
141 $files = wp_kses_post_deep( wp_unslash( $_FILES['my_file_upload'] ) );
142 foreach ( $files['name'] as $key => $value ) {
143 if ( $files['name'][$key] ) {
144 $file = [
145 'name' => $files['name'][$key],
146 'type' => $files['type'][$key],
147 'tmp_name' => $files['tmp_name'][$key],
148 'error' => $files['error'][$key],
149 'size' => $files['size'][$key],
150 ];
151 $_FILES = [
152 'upload_file' => $file,
153 ];
154 $attachment_id = media_handle_upload( 'upload_file', 0 );
155 if ( is_wp_error( $attachment_id ) ) {
156 // There was an error uploading the image.
157 $result['status'] = false;
158 $result['message'] = __( 'Error uploading file.', 'adminify' );
159 } else {
160 // The image was uploaded successfully!
161 $result['status'] = true;
162 $result['message'] = __( 'File Uploaded successfully.', 'adminify' );
163 $result['images'][$attachment_id] = wp_get_attachment_url( $attachment_id );
164 }
165 }
166 }
167 remove_filter( 'upload_dir', [$this, 'adminify_icon_custom_upload_dir'] );
168 echo wp_json_encode( $result );
169 wp_die();
170 }
171
172 public function adminify_icon_custom_upload_dir( $dir_data ) {
173 // $dir_data already you might want to use
174 $custom_dir = 'adminify-custom-icons';
175 return [
176 'path' => $dir_data['basedir'] . '/' . $custom_dir,
177 'url' => $dir_data['baseurl'] . '/' . $custom_dir,
178 'subdir' => '/' . $custom_dir,
179 'basedir' => $dir_data['basedir'],
180 'baseurl' => $dir_data['baseurl'],
181 'error' => $dir_data['error'],
182 ];
183 }
184
185 // Menu Editor Body Class
186 public function jltwp_adminify_menu_editor_body_class( $classes ) {
187 $classes .= ' adminify_menu_editor ';
188 return $classes;
189 }
190
191 /**
192 * Sanitises and strips tags of input from ajax
193 *
194 * @since 1.0.0
195 * @variables $values = item to clean (array or string)
196 */
197 public function clean_ajax_input( $values ) {
198 if ( is_array( $values ) ) {
199 foreach ( $values as $index => $in ) {
200 if ( is_array( $in ) ) {
201 $values[$index] = $this->clean_ajax_input( $in );
202 } else {
203 $values[$index] = strip_tags( $in );
204 }
205 }
206 } else {
207 $values = strip_tags( $values );
208 }
209 return $values;
210 }
211
212 /**
213 * Returns ajax error
214 *
215 * @since 1.4
216 * @variables $message = error message to send back to user (string)
217 */
218 public function ajax_error_message( $message ) {
219 $returndata = [];
220 $returndata['error'] = true;
221 $returndata['error_message'] = $message;
222 return json_encode( $returndata );
223 }
224
225 public function adminify_save_menu_settings() {
226 if ( defined( 'DOING_AJAX' ) && DOING_AJAX && check_ajax_referer( 'adminify-menu-editor-security-nonce', 'security' ) > 0 ) {
227 if ( !current_user_can( 'manage_options' ) ) {
228 wp_send_json_error( array(
229 'message' => __( 'You do not have permission to perform this action.', 'adminify' ),
230 ) );
231 }
232 $options = wp_kses_post_deep( wp_unslash( $_POST['options'] ) );
233 $options = $this->clean_ajax_input( $options );
234 if ( $options == '' || !is_array( $options ) ) {
235 $message = __( 'No options supplied to save', 'adminify' );
236 echo Utils::wp_kses_custom( $this->ajax_error_message( $message ) );
237 die;
238 }
239 if ( is_array( $options ) ) {
240 update_option( $this->prefix, $options );
241 $returndata = [];
242 $returndata['success'] = true;
243 $returndata['message'] = __( 'Settings saved', 'adminify' );
244 echo json_encode( $returndata );
245 die;
246 } else {
247 $message = __( 'Something went wrong', 'adminify' );
248 echo Utils::wp_kses_custom( $this->ajax_error_message( $message ) );
249 die;
250 }
251 }
252 die;
253 }
254
255 /**
256 * Menu Editor Settings Reset
257 *
258 * @return void
259 */
260 public function adminify_reset_menu_settings() {
261 if ( defined( 'DOING_AJAX' ) && DOING_AJAX && check_ajax_referer( 'adminify-menu-editor-security-nonce', 'security' ) > 0 ) {
262 if ( !current_user_can( 'manage_options' ) ) {
263 wp_send_json_error( array(
264 'message' => __( 'You do not have permission to perform this action.', 'adminify' ),
265 ) );
266 }
267 update_option( $this->prefix, [] );
268 $menu_editor_options = get_option( $this->prefix );
269 if ( !$menu_editor_options ) {
270 $returndata = [];
271 $returndata['success'] = true;
272 $returndata['message'] = __( 'Settings reset', 'adminify' );
273 echo json_encode( $returndata );
274 die;
275 } else {
276 $message = __( 'Something went wrong', 'adminify' );
277 echo Utils::wp_kses_custom( $this->ajax_error_message( $message ) );
278 die;
279 }
280 }
281 die;
282 }
283
284 /**
285 * Export Menu Editor Settings
286 *
287 * @return void
288 */
289 public function adminify_export_menu_settings() {
290 if ( defined( 'DOING_AJAX' ) && DOING_AJAX && check_ajax_referer( 'adminify-menu-editor-security-nonce', 'security' ) > 0 ) {
291 if ( !current_user_can( 'manage_options' ) ) {
292 wp_send_json_error( array(
293 'message' => __( 'You do not have permission to perform this action.', 'adminify' ),
294 ) );
295 }
296 $menu_editor_options = get_option( $this->prefix );
297 echo json_encode( $menu_editor_options );
298 }
299 die;
300 }
301
302 /**
303 * Import Menu Editor Settings
304 *
305 * @since 1.0.0
306 */
307 public function adminify_import_menu_settings() {
308 if ( defined( 'DOING_AJAX' ) && DOING_AJAX && check_ajax_referer( 'adminify-menu-editor-security-nonce', 'security' ) > 0 ) {
309 if ( !current_user_can( 'manage_options' ) ) {
310 wp_send_json_error( array(
311 'message' => __( 'You do not have permission to perform this action.', 'adminify' ),
312 ) );
313 }
314 $new_options = wp_kses_post_deep( $_POST['settings'] );
315 if ( $new_options == '' || !is_array( $new_options ) ) {
316 $message = __( 'No options supplied to save', 'adminify' );
317 echo Utils::wp_kses_custom( $this->ajax_error_message( $message ) );
318 die;
319 }
320 if ( is_array( $new_options ) ) {
321 update_option( $this->prefix, $new_options );
322 $returndata = [];
323 $returndata['success'] = true;
324 $returndata['message'] = __( 'Menu Imported', 'adminify' );
325 echo json_encode( $returndata );
326 die;
327 } else {
328 $message = __( 'Something went wrong', 'adminify' );
329 echo Utils::wp_kses_custom( $this->ajax_error_message( $message ) );
330 die;
331 }
332 }
333 die;
334 }
335
336 /**
337 * Get menu items
338 *
339 * @param [type] $parent_file
340 *
341 * @return void
342 */
343 public function set_menu( $parent_file ) {
344 global $menu, $submenu;
345 $this->menu = $this->sort_menu_settings( $menu );
346 $this->submenu = $this->sort_sub_menu_settings( $this->menu, $submenu );
347 return $parent_file;
348 }
349
350 /**
351 * Sorts Menu's for Option settings
352 */
353 public function sort_menu_settings( $thismenu ) {
354 $menu_settings = $this->menu_settings;
355 $tempmenu = [];
356 foreach ( $thismenu as $key => $current_menu_item ) {
357 if ( $current_menu_item[4] === "wp-menu-separator" ) {
358 unset($thismenu[$key]);
359 continue;
360 }
361 if ( !current_user_can( 'administrator' ) && $current_menu_item[2] === 'vc-welcome' ) {
362 unset($thismenu[$key]);
363 continue;
364 }
365 $next_menu_item = next( $thismenu );
366 $optiongroup = [];
367 $order = $key;
368 $separator = 0;
369 $external_link = 0;
370 $icon = null;
371 $hidden_for = [];
372 if ( !empty( $next_menu_item ) && strpos( $next_menu_item[2], 'separator' ) !== false ) {
373 $separator = 1;
374 }
375 if ( is_array( $menu_settings ) ) {
376 if ( isset( $menu_settings[$current_menu_item[2]] ) ) {
377 $optiongroup = $menu_settings[$current_menu_item[2]];
378 if ( isset( $optiongroup['order'] ) ) {
379 $order = $optiongroup['order'];
380 }
381 if ( isset( $optiongroup['separator'] ) ) {
382 $separator = $optiongroup['separator'];
383 }
384 if ( isset( $optiongroup['external_link'] ) ) {
385 $external_link = $optiongroup['external_link'];
386 }
387 if ( !empty( $optiongroup['icon'] ) ) {
388 $icon = $optiongroup['icon'];
389 }
390 if ( !empty( $optiongroup['hidden_for'] ) ) {
391 $hidden_for = $optiongroup['hidden_for'];
392 }
393 }
394 }
395 $current_menu_item['order'] = $order;
396 $current_menu_item['hidden_for'] = $hidden_for;
397 $current_menu_item['separator'] = $separator;
398 $current_menu_item['external_link'] = $external_link;
399 // if (empty($this->options['admin_ui'])) {
400 if ( $icon !== null ) {
401 if ( strpos( $icon, 'dashicons ' ) !== false ) {
402 $menu_icon = str_replace( 'dashicons ', '', $icon );
403 $current_menu_item[6] = $menu_icon;
404 } else {
405 if ( strpos( $icon, ',' ) !== false ) {
406 $menu_icon = explode( ',', $icon )[1];
407 } else {
408 $menu_icon = 'dashicons-adminify- ' . $icon;
409 }
410 $current_menu_item[6] = $menu_icon;
411 }
412 }
413 if ( $separator == 1 ) {
414 $current_menu_item[4] = $current_menu_item[4] . ' adminify-menu-separator';
415 }
416 // }
417 array_push( $tempmenu, $current_menu_item );
418 if ( isset( $menu_settings[$current_menu_item[2]] ) ) {
419 unset($menu_settings[$current_menu_item[2]]);
420 }
421 }
422 if ( is_array( $menu_settings ) && !array_key_exists( 0, $menu_settings ) ) {
423 foreach ( $menu_settings as $key => $menu_s ) {
424 // Skip if $menu_s is not an array
425 if ( !is_array( $menu_s ) ) {
426 continue;
427 }
428 // Ensure required keys exist with defaults
429 $menu_s = wp_parse_args( $menu_s, [
430 'name' => '',
431 'link' => '',
432 'icon' => '',
433 'order' => 0,
434 'separator' => 0,
435 'external_link' => 0,
436 'hidden_for' => [],
437 ] );
438 $new_array = [
439 $menu_s['name'],
440 'read',
441 ( !empty( $menu_s['link'] ) ? $menu_s['link'] : '' ),
442 '',
443 'menu-top menu-icon-custom',
444 $key,
445 ( !empty( $menu_s['icon'] ) ? $menu_s['icon'] : '' ),
446 'order' => $menu_s['order'],
447 'separator' => ( !empty( $menu_s['separator'] ) ? $menu_s['separator'] : 0 ),
448 'external_link' => ( !empty( $menu_s['external_link'] ) ? $menu_s['external_link'] : 0 ),
449 'hidden_for' => ( !empty( $menu_s['hidden_for'] ) ? $menu_s['hidden_for'] : [] )
450 ];
451 // if (empty($this->options['admin_ui'])) {
452 if ( strpos( $menu_s['icon'], 'dashicons ' ) !== false ) {
453 $menu_icon = str_replace( 'dashicons ', '', $menu_s['icon'] );
454 } else {
455 if ( empty( $menu_s['icon'] ) || strpos( $menu_s['icon'], ',' ) !== false ) {
456 if ( empty( $menu_s['icon'] ) ) {
457 $menu_icon = WP_ADMINIFY_ASSETS_IMAGE . 'logos/menu-icon.svg';
458 } else {
459 $menu_icon = explode( ',', $menu_s['icon'] )[1];
460 }
461 } else {
462 $menu_icon = 'dashicons-adminify- ' . $menu_s['icon'];
463 }
464 }
465 if ( !empty( $menu_s['separator'] ) && $menu_s['separator'] == 1 ) {
466 $new_array[4] = $new_array[4] . ' adminify-menu-separator';
467 }
468 // if (!empty($menu_s['external_link']) && $menu_s['external_link'] == 1) {
469 // $new_array[4] = $new_array[4] . ' adminify-menu-external_link';
470 // }
471 $new_array[6] = $menu_icon;
472 // }
473 array_push( $tempmenu, $new_array );
474 }
475 }
476 return $this->sort_array( $tempmenu );
477 }
478
479 /**
480 * usort function for menu arrays
481 */
482 public function sort_array_helper( $a, $b ) {
483 $result = 0;
484 if ( !isset( $a['order'] ) ) {
485 return $result;
486 }
487 if ( $a['order'] > $b['order'] ) {
488 $result = 1;
489 } elseif ( $a['order'] < $b['order'] ) {
490 $result = -1;
491 }
492 return $result;
493 }
494
495 /**
496 * Sorts arrays by key 'order'
497 */
498 public function sort_array( $tosort ) {
499 usort( $tosort, [$this, 'sort_array_helper'] );
500 return $tosort;
501 }
502
503 /**
504 * Sorts Sub Menu for settings
505 *
506 * @since 1.4
507 */
508 public function sort_sub_menu_settings( $themenu, $thesubmenu ) {
509 $menu_settings = $this->menu_settings;
510 $tempsubmenu = [];
511 foreach ( $themenu as $current_menu_item ) {
512 $optiongroup = [];
513 $submenu_items = [];
514 if ( isset( $thesubmenu[$current_menu_item[2]] ) ) {
515 $submenuitems = $thesubmenu[$current_menu_item[2]];
516 foreach ( $submenuitems as $key => $subitem ) {
517 $subitem['order'] = $key;
518 if ( is_array( $menu_settings ) && isset( $menu_settings[$current_menu_item[2]] ) && isset( $menu_settings[$current_menu_item[2]]['submenu'] ) ) {
519 $submenugroup = $menu_settings[$current_menu_item[2]]['submenu'];
520 if ( isset( $submenugroup[$subitem[2]] ) ) {
521 $itemoptions = $submenugroup[$subitem[2]];
522 if ( isset( $itemoptions['order'] ) ) {
523 $subitem['order'] = $itemoptions['order'];
524 }
525 }
526 }
527 array_push( $submenu_items, $subitem );
528 }
529 $submenu_items = $this->sort_array( $submenu_items );
530 $tempsubmenu[$current_menu_item[2]] = $submenu_items;
531 }
532 }
533 if ( is_array( $menu_settings ) ) {
534 $tmp_menu = [];
535 foreach ( $menu_settings as $key => $menu_s ) {
536 if ( isset( $menu_s['submenu'] ) && is_array( $menu_s['submenu'] ) ) {
537 $tmp_sub_menu = [];
538 $i = 0;
539 foreach ( $menu_s['submenu'] as $k => $sub_menu ) {
540 if ( strpos( $k, 'adminify-custom-submenu' ) === false ) {
541 continue;
542 }
543 $order = ( $sub_menu['order'] ? $sub_menu['order'] : $i );
544 $new_array = [
545 ( $sub_menu['name'] ? $sub_menu['name'] : '' ),
546 'read',
547 ( $sub_menu['link'] ? $sub_menu['link'] : '' ),
548 'order' => $order,
549 'key' => $k,
550 'hidden_for' => ( isset( $sub_menu['hidden_for'] ) ? $sub_menu['hidden_for'] : [] )
551 ];
552 // processing submenu array
553 $tmp_sub_menu[$order] = $new_array;
554 $i++;
555 }
556 if ( !empty( $tmp_sub_menu ) ) {
557 // adding submenu into temp variable
558 $tmp_menu[$key] = $tmp_sub_menu;
559 }
560 }
561 }
562 if ( !empty( $tmp_menu ) ) {
563 $tempsubmenu = array_merge_recursive( $tempsubmenu, $tmp_menu );
564 }
565 foreach ( $tempsubmenu as $m_k => $m_menu ) {
566 $tempsubmenu[$m_k] = $this->sort_array( $tempsubmenu[$m_k] );
567 }
568 }
569 return $tempsubmenu;
570 }
571
572 /**
573 * Applies menu settings
574 */
575 public function apply_menu( $parent_file ) {
576 // Not applicable for Network Admin
577 if ( is_multisite() && is_network_admin() ) {
578 return;
579 }
580 global $menu, $submenu;
581 $tempmenu = [];
582 $tempsub = [];
583 $submenu = $this->sort_sub_menu_settings( $menu, $submenu );
584 if ( $this->menu && is_array( $this->menu ) ) {
585 foreach ( $this->menu as $key => $menu_item ) {
586 if ( empty( $menu_item[2] ) ) {
587 continue;
588 }
589 if ( strpos( $menu_item[2], 'separator' ) !== false && !$menu_item[0] ) {
590 // Build Separator
591 $newitem = $this->apply_separator_settings( $menu_item, $key );
592 if ( $newitem ) {
593 array_push( $tempmenu, $newitem );
594 }
595 } else {
596 // Build Top Level
597 $newitem = $this->apply_top_level_settings( $menu_item, $key );
598 if ( $newitem ) {
599 array_push( $tempmenu, $newitem );
600 // Menu Editor Custom Separator
601 if ( !empty( $newitem['separator'] ) ) {
602 $separator_order = $this->menu[$key]['order'];
603 $empty_separator = array(
604 0 => '',
605 1 => 'read',
606 2 => 'separator_' . rand( 200, 1000 ) * 1000,
607 3 => '',
608 4 => 'wp-menu-separator',
609 'order' => $separator_order + 0.5,
610 );
611 array_push( $tempmenu, $empty_separator );
612 }
613 $parent_key = $newitem[2];
614 if ( strpos( $newitem[5], 'adminify-custom-menu-' ) !== false ) {
615 $parent_key = $newitem[5];
616 }
617 if ( isset( $this->submenu[$parent_key] ) ) {
618 $subitem = $this->apply_sub_level_settings( $this->submenu[$parent_key], $parent_key );
619 if ( $subitem ) {
620 $tempsub[$newitem[2]] = $this->apply_sub_level_settings( $this->submenu[$parent_key], $parent_key );
621 }
622 }
623 }
624 }
625 }
626 }
627 $submenu = $tempsub;
628 $menu = $this->sort_array( $tempmenu );
629 return $parent_file;
630 }
631
632 /**
633 * Applies sub level menu item settings
634 *
635 * @return $tempsub | false
636 *
637 * @since 1.4
638 */
639 public function apply_sub_level_settings( $subitems, $parentname ) {
640 if ( !is_array( $this->menu_settings ) ) {
641 return $subitems;
642 }
643 if ( !isset( $this->menu_settings[$parentname]['submenu'] ) ) {
644 return $subitems;
645 }
646 $submenu_settings = $this->menu_settings[$parentname]['submenu'];
647 $tempsub = [];
648 foreach ( $subitems as $current_menu_item ) {
649 $sub_level = apply_filters( 'adminify/menu_editor', [
650 'sub_level' => false,
651 ] );
652 if ( !empty( $sub_level['sub_level'] ) ) {
653 if ( empty( $current_menu_item[0] ) || $current_menu_item[2] === 'wp-adminify-settings-pricing' ) {
654 continue;
655 }
656 }
657 $name = '';
658 $link = '';
659 $disabled_for = [];
660 $optiongroup = [];
661 // NO SETTINGS
662 if ( isset( $submenu_settings[$current_menu_item[2]] ) ) {
663 $optiongroup = $submenu_settings[$current_menu_item[2]];
664 if ( isset( $optiongroup['name'] ) ) {
665 $name = $optiongroup['name'];
666 if ( $name != '' ) {
667 $current_menu_item[0] = $name;
668 }
669 }
670 if ( isset( $optiongroup['link'] ) ) {
671 $link = $optiongroup['link'];
672 if ( $link != '' ) {
673 $current_menu_item[2] = $link;
674 $current_menu_item['link'] = $link;
675 }
676 }
677 if ( isset( $optiongroup['external_link'] ) ) {
678 $external_link = $optiongroup['external_link'];
679 }
680 if ( isset( $optiongroup['hidden_for'] ) ) {
681 $disabled_for = $optiongroup['hidden_for'];
682 if ( $this->is_hidden( $disabled_for ) ) {
683 $current_menu_item['hidden_for'] = true;
684 continue;
685 }
686 }
687 }
688 $custom_menu = ( isset( $current_menu_item['key'] ) ? $current_menu_item['key'] : '' );
689 if ( strpos( $custom_menu, 'adminify-custom-submenu-' ) !== false ) {
690 if ( isset( $submenu_settings[$current_menu_item['key']]['hidden_for'] ) ) {
691 $disabled_for = $submenu_settings[$current_menu_item['key']]['hidden_for'];
692 }
693 if ( isset( $submenu_settings[$current_menu_item['key']]['external_link'] ) ) {
694 $external_link = $submenu_settings[$current_menu_item['key']]['external_link'];
695 }
696 if ( $this->is_hidden( $disabled_for ) ) {
697 $current_menu_item['hidden_for'] = true;
698 continue;
699 }
700 }
701 array_push( $tempsub, $current_menu_item );
702 }
703 if ( count( $tempsub ) < 1 ) {
704 return false;
705 } else {
706 return $tempsub;
707 }
708 }
709
710 /**
711 * Applies top level menu item settings
712 *
713 * @since 1.4
714 */
715 public function apply_top_level_settings( $current_menu_item, $key ) {
716 $name = '';
717 $link = '';
718 $icon = '';
719 $disabled_for = [];
720 $optiongroup = [];
721 $order = $key;
722 if ( is_array( $this->menu_settings ) ) {
723 if ( isset( $this->menu_settings[$current_menu_item[2]] ) ) {
724 $optiongroup = $this->menu_settings[$current_menu_item[2]];
725 if ( isset( $optiongroup['name'] ) ) {
726 $name = $optiongroup['name'];
727 if ( $name != '' ) {
728 $current_menu_item[0] = $name;
729 }
730 }
731 if ( isset( $optiongroup['link'] ) ) {
732 $link = $optiongroup['link'];
733 if ( $link != '' ) {
734 $current_menu_item[2] = $link;
735 $current_menu_item['link'] = $link;
736 }
737 }
738 if ( isset( $optiongroup['external_link'] ) ) {
739 $external_link = ( $optiongroup['external_link'] ? $optiongroup['external_link'] : '' );
740 }
741 if ( isset( $optiongroup['icon'] ) ) {
742 $icon = $optiongroup['icon'];
743 if ( $icon != '' ) {
744 $current_menu_item['icon'] = $icon;
745 }
746 }
747 if ( isset( $optiongroup['order'] ) ) {
748 $order = $optiongroup['order'];
749 }
750 if ( isset( $optiongroup['hidden_for'] ) ) {
751 $disabled_for = $optiongroup['hidden_for'];
752 if ( $this->is_hidden( $disabled_for ) ) {
753 $current_menu_item['hidden_for'] = true;
754 } else {
755 $current_menu_item['hidden_for'] = false;
756 }
757 }
758 }
759 $custom_menu = ( isset( $current_menu_item[5] ) ? $current_menu_item[5] : '' );
760 if ( strpos( $custom_menu, 'adminify-custom-menu-' ) !== false ) {
761 if ( isset( $this->menu_settings[$current_menu_item[5]]['hidden_for'] ) && !empty( $this->menu_settings[$current_menu_item[5]]['hidden_for'] ) ) {
762 $disabled_for = $this->menu_settings[$current_menu_item[5]]['hidden_for'];
763 if ( $this->is_hidden( $disabled_for ) ) {
764 $current_menu_item['hidden_for'] = true;
765 }
766 }
767 if ( isset( $this->menu_settings[$current_menu_item[5]]['external_link'] ) ) {
768 $external_link = $this->menu_settings[$current_menu_item[5]]['external_link'];
769 }
770 }
771 }
772 $current_menu_item['order'] = $order;
773 if ( isset( $current_menu_item['hidden_for'] ) ) {
774 if ( $current_menu_item['hidden_for'] === true ) {
775 return false;
776 } else {
777 return $current_menu_item;
778 }
779 } else {
780 return $current_menu_item;
781 }
782 }
783
784 /**
785 * Hidden for method
786 *
787 * @param [type] $disabled_for
788 *
789 * @return boolean
790 */
791 public function is_hidden( $disabled_for ) {
792 if ( !is_array( $disabled_for ) ) {
793 return false;
794 }
795 $current_user = wp_get_current_user();
796 $current_roles = $current_user->roles;
797 $all_roles = wp_roles()->get_names();
798 foreach ( $current_roles as $current_role ) {
799 if ( isset( $all_roles[$current_role] ) && in_array( $all_roles[$current_role], $disabled_for ) ) {
800 return true;
801 }
802 }
803 // Normalize disabled_for array
804 $disabled_for_arr = [];
805 foreach ( $disabled_for as $v ) {
806 $disabled_for_arr[] = jlt_adminify_sluggify_with_underscores( $v );
807 }
808 $slugify_user_login = jlt_adminify_sluggify_with_underscores( $current_user->user_login );
809 // Check Username
810 if ( in_array( $current_user->user_login, $disabled_for_arr ) || in_array( $slugify_user_login, $disabled_for_arr ) ) {
811 return true;
812 }
813 // Check User Roles and Capabilities
814 foreach ( $current_roles as $role ) {
815 $role_obj = get_role( $role );
816 if ( !$role_obj ) {
817 continue;
818 }
819 // Check if role slug is in disabled array
820 if ( in_array( $role, $disabled_for_arr ) ) {
821 return true;
822 }
823 // Check if role display name is in disabled array
824 if ( isset( $disabled_for_arr[$role] ) && (in_array( $all_roles[$role], $disabled_for ) || in_array( strtolower( $all_roles[$role] ), array_map( 'strtolower', $disabled_for ) )) ) {
825 return true;
826 }
827 // Check for custom roles
828 foreach ( $disabled_for as $disabled_item ) {
829 // Convert role names to match WordPress format
830 $disabled_role = str_replace( ' ', '_', strtolower( $disabled_item ) );
831 if ( $role === $disabled_role ) {
832 return true;
833 }
834 }
835 }
836 // Handle Super Admin specially
837 if ( is_super_admin( $current_user->ID ) ) {
838 if ( in_array( 'Super Admin', $disabled_for_arr ) || in_array( 'super_admin', $disabled_for_arr ) || in_array( 'administrator', $disabled_for_arr ) ) {
839 return true;
840 }
841 // Super admin sees everything by default unless explicitly disabled
842 return false;
843 }
844 // Special check for user ID 1 (default admin)
845 if ( $current_user->ID === 1 ) {
846 if ( in_array( 'Super Admin', $disabled_for_arr ) || in_array( 'super_admin', $disabled_for_arr ) || in_array( 'administrator', $disabled_for_arr ) ) {
847 return true;
848 }
849 return false;
850 }
851 return false;
852 }
853
854 /**
855 * Applies separator menu item settings
856 *
857 * @since 1.0.0
858 */
859 public function apply_separator_settings( $current_menu_item, $key ) {
860 $name = '';
861 $disabled_for = [];
862 $optiongroup = [];
863 $order = $key;
864 if ( is_array( $this->menu_settings ) ) {
865 if ( isset( $this->menu_settings[$current_menu_item[2]] ) ) {
866 $optiongroup = $this->menu_settings[$current_menu_item[2]];
867 if ( isset( $optiongroup['name'] ) ) {
868 $name = $optiongroup['name'];
869 if ( $name != '' ) {
870 $current_menu_item['name'] = $name;
871 }
872 }
873 if ( isset( $optiongroup['order'] ) ) {
874 $order = $optiongroup['order'];
875 }
876 if ( isset( $optiongroup['hidden_for'] ) ) {
877 $disabled_for = $optiongroup['hidden_for'];
878 if ( $this->is_hidden( $disabled_for ) ) {
879 $current_menu_item['hidden_for'] = true;
880 }
881 }
882 }
883 }
884 $current_menu_item['order'] = $order;
885 if ( isset( $current_menu_item['hidden_for'] ) ) {
886 if ( $current_menu_item['hidden_for'] == true ) {
887 return false;
888 } else {
889 return $current_menu_item;
890 }
891 } else {
892 return $current_menu_item;
893 }
894 }
895
896 public function get_saved_sub_menu() {
897 $menu_settings = $this->menu_settings;
898 $menu = $this->menu;
899 $submenu = $this->submenu;
900 if ( is_array( $menu_settings ) && !array_key_exists( 0, $menu_settings ) ) {
901 foreach ( $menu as $menu_item ) {
902 if ( isset( $menu_settings[$menu_item[2]] ) ) {
903 unset($menu_settings[$menu_item[2]]);
904 }
905 }
906 $tmp_menu = [];
907 foreach ( $menu_settings as $key => $menu_s ) {
908 if ( isset( $menu_s['submenu'] ) && is_array( $menu_s['submenu'] ) ) {
909 $tmp_sub_menu = [];
910 $i = 0;
911 foreach ( $menu_s['submenu'] as $k => $sub_menu ) {
912 $new_array = [
913 $sub_menu['name'],
914 'read',
915 $sub_menu['link'],
916 'order' => $i
917 ];
918 $tmp_sub_menu[$i] = $new_array;
919 $i++;
920 }
921 if ( !empty( $tmp_sub_menu ) ) {
922 $tmp_menu[$key] = $tmp_sub_menu;
923 }
924 }
925 }
926 if ( !empty( $tmp_menu ) ) {
927 $submenu = $submenu + $tmp_menu;
928 }
929 }
930 return $submenu;
931 }
932
933 /**
934 * Render Menu Editor
935 */
936 public function render_menu_editor() {
937 global $wp_roles;
938 $users = get_users();
939 $this->users = $users;
940 $this->roles = $wp_roles->roles;
941 if ( $this->menu && is_array( $this->menu ) ) {
942 foreach ( $this->menu as $menu_item ) {
943 $next_menu_item = next( $this->menu );
944 if ( strpos( $menu_item[2], 'separator' ) !== false && !$menu_item[0] ) {
945 // Render Separator
946 // $this->render_menu_separator($menu_item);
947 } else {
948 // Render Top Level menu
949 $this->render_top_level_menu_item(
950 $this->menu,
951 $menu_item,
952 $this->submenu,
953 $next_menu_item
954 );
955 }
956 }
957 $this->render_add_new_menu_item();
958 ?>
959 <script>
960 jQuery(function($) {
961
962 $('.adminify-menu-settings').tokenize2({
963 placeholder: '<?php
964 esc_html_e( 'Select roles or users', 'adminify' );
965 ?>'
966 });
967
968 $('.adminify-menu-settings').on('tokenize:select', function() {
969 $(this).tokenize2().trigger('tokenize:search', [$(this).tokenize2().input.val()]);
970 });
971
972 });
973 </script>
974 <?php
975 }
976 }
977
978 public function get_icon( $value, $default ) {
979 if ( empty( $value ) ) {
980 return $default;
981 }
982 return $value;
983 }
984
985 /**
986 * Generate User Rules Select box
987 */
988 public function generate_user_rules_select_field( $menu_id, $disabled_for, $menu_type = 'menu' ) {
989 ob_start();
990 ?>
991 <select class="adminify-menu-settings <?php
992 echo $menu_type;
993 ?>_setting" name="hidden_for" id="<?php
994 echo esc_attr( $menu_id );
995 ?>-user-role-types" multiple>
996 <?php
997 $sel = '';
998 // if (in_array('Super Admin', $disabled_for)) {
999 // $sel = 'selected';
1000 // }
1001 ?>
1002
1003 <!-- <option value="Super Admin" <?php
1004 // echo esc_attr($sel);
1005 ?>><?php
1006 // esc_html_e('Super Admin', 'adminify');
1007 ?></option> -->
1008
1009 <?php
1010 foreach ( $this->roles as $role ) {
1011 $rolename = $role['name'];
1012 if ( 'administrator' == strtolower( $rolename ) ) {
1013 continue;
1014 }
1015 $sel = '';
1016 if ( in_array( $rolename, $disabled_for ) ) {
1017 $sel = 'selected';
1018 }
1019 ?>
1020 <option value="<?php
1021 echo esc_attr( $rolename );
1022 ?>" <?php
1023 echo esc_attr( $sel );
1024 ?>><?php
1025 echo esc_html( $rolename );
1026 ?></option>
1027 <?php
1028 }
1029 foreach ( $this->users as $user ) {
1030 $username = $user->display_name;
1031 $user_login = $user->user_login;
1032 $sel = '';
1033 if ( in_array( $user_login, $disabled_for ) ) {
1034 $sel = 'selected';
1035 }
1036 ?>
1037 <option value="<?php
1038 echo wp_kses_post( $user_login );
1039 ?>" <?php
1040 echo esc_attr( $sel );
1041 ?>><?php
1042 echo wp_kses_post( $user_login );
1043 ?></option>
1044 <?php
1045 }
1046 ?>
1047 </select>
1048 <?php
1049 return ob_get_clean();
1050 }
1051
1052 /**
1053 * Render Top Level menu Item
1054 *
1055 * @return void
1056 */
1057 public function render_top_level_menu_item(
1058 $master_menu,
1059 $current_menu_item,
1060 $master_sub_menu,
1061 $next_menu_item
1062 ) {
1063 if ( empty( $current_menu_item[2] ) ) {
1064 return;
1065 }
1066 // $disabled_for = '';
1067 $menu_id = preg_replace( '/[^A-Za-z0-9 ]/', '', $current_menu_item[5] );
1068 $name = '';
1069 $link = '';
1070 $external_link = '';
1071 $icon = '';
1072 $separator = '';
1073 $disabled_for = [];
1074 $optiongroup = [];
1075 $menu_options = $this->menu_settings;
1076 if ( !empty( $next_menu_item ) && strpos( $next_menu_item[2], 'separator' ) !== false ) {
1077 $separator = 1;
1078 }
1079 if ( is_array( $menu_options ) ) {
1080 if ( isset( $menu_options[$current_menu_item[2]] ) ) {
1081 $optiongroup = $menu_options[$current_menu_item[2]];
1082 if ( isset( $optiongroup['name'] ) ) {
1083 $name = $optiongroup['name'];
1084 }
1085 if ( isset( $optiongroup['link'] ) ) {
1086 $link = $optiongroup['link'];
1087 }
1088 if ( isset( $optiongroup['icon'] ) ) {
1089 $icon = $optiongroup['icon'];
1090 }
1091 if ( isset( $optiongroup['hidden_for'] ) ) {
1092 $disabled_for = $optiongroup['hidden_for'];
1093 }
1094 if ( isset( $optiongroup['separator'] ) ) {
1095 $separator = $optiongroup['separator'];
1096 }
1097 if ( isset( $optiongroup['external_link'] ) ) {
1098 $external_link = $optiongroup['external_link'];
1099 }
1100 }
1101 }
1102 $name_attr = $current_menu_item[2];
1103 if ( strpos( $current_menu_item[5], 'adminify-custom-menu-' ) !== false ) {
1104 $name_attr = $current_menu_item[5];
1105 $name = $current_menu_item[0];
1106 $link = $current_menu_item[2];
1107 if ( isset( $menu_options[$current_menu_item[5]]['hidden_for'] ) ) {
1108 $disabled_for = $menu_options[$current_menu_item[5]]['hidden_for'];
1109 }
1110 if ( isset( $menu_options[$current_menu_item[5]] ) ) {
1111 $optiongroup = $menu_options[$current_menu_item[5]];
1112 }
1113 if ( isset( $menu_options[$current_menu_item[5]]['icon'] ) ) {
1114 $icon = $menu_options[$current_menu_item[5]]['icon'];
1115 }
1116 if ( isset( $current_menu_item['separator'] ) ) {
1117 $separator = $current_menu_item['separator'];
1118 }
1119 if ( isset( $current_menu_item['external_link'] ) ) {
1120 $external_link = $current_menu_item['external_link'];
1121 }
1122 }
1123 if ( !is_array( $disabled_for ) ) {
1124 $disabled_for = [];
1125 }
1126 // LIST OF AVAILABLE MENU ICONS
1127 $icons = [
1128 'dashicons-admin-multisite' => 'dashicons dashicons-admin-multisite',
1129 'dashicons-dashboard' => 'dashicons dashicons-dashboard',
1130 'dashicons-admin-post' => 'dashicons dashicons-admin-post',
1131 'dashicons-database' => 'dashicons dashicons-database',
1132 'dashicons-admin-media' => 'dashicons dashicons-admin-media',
1133 'dashicons-admin-page' => 'dashicons dashicons-admin-page',
1134 'dashicons-admin-comments' => 'dashicons dashicons-admin-comments',
1135 'dashicons-admin-appearance' => 'dashicons dashicons-admin-appearance',
1136 'dashicons-admin-plugins' => 'dashicons dashicons-admin-plugins',
1137 'dashicons-admin-users' => 'dashicons dashicons-admin-users',
1138 'dashicons-admin-tools' => 'dashicons dashicons-admin-tools',
1139 'dashicons-chart-bar' => 'dashicons dashicons-chart-bar',
1140 'dashicons-admin-settings' => 'dashicons dashicons-admin-settings',
1141 ];
1142 $default_icons = ( isset( $current_menu_item ) ? $current_menu_item[6] : 'dashicons dashicons-external' );
1143 ?>
1144 <div class="accordion adminify_menu_item" name="<?php
1145 echo esc_attr( $name_attr );
1146 ?>" id="wp-adminify-top-menu-<?php
1147 echo esc_attr( $menu_id );
1148 ?>">
1149 <input type="number" class="top_level_order" value="" style="display:none;">
1150 <a class="menu-editor-title accordion-button adminify-flex adminify-flex-center adminify-gap-2" href="#">
1151 <svg class="drag-icon is-pulled-left mr-2" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
1152 <path d="M12 14C13.1046 14 14 13.1046 14 12C14 10.8954 13.1046 10 12 10C10.8954 10 10 10.8954 10 12C10 13.1046 10.8954 14 12 14Z" fill="#4E4B66" fill-opacity="0.72" />
1153 <path d="M12 7C13.1046 7 14 6.10457 14 5C14 3.89543 13.1046 3 12 3C10.8954 3 10 3.89543 10 5C10 6.10457 10.8954 7 12 7Z" fill="#4E4B66" fill-opacity="0.72" />
1154 <path d="M12 21C13.1046 21 14 20.1046 14 19C14 17.8954 13.1046 17 12 17C10.8954 17 10 17.8954 10 19C10 20.1046 10.8954 21 12 21Z" fill="#4E4B66" fill-opacity="0.72" />
1155 <path d="M5 14C6.10457 14 7 13.1046 7 12C7 10.8954 6.10457 10 5 10C3.89543 10 3 10.8954 3 12C3 13.1046 3.89543 14 5 14Z" fill="#4E4B66" fill-opacity="0.72" />
1156 <path d="M5 7C6.10457 7 7 6.10457 7 5C7 3.89543 6.10457 3 5 3C3.89543 3 3 3.89543 3 5C3 6.10457 3.89543 7 5 7Z" fill="#4E4B66" fill-opacity="0.72" />
1157 <path d="M5 21C6.10457 21 7 20.1046 7 19C7 17.8954 6.10457 17 5 17C3.89543 17 3 17.8954 3 19C3 20.1046 3.89543 21 5 21Z" fill="#4E4B66" fill-opacity="0.72" />
1158 <path d="M19 14C20.1046 14 21 13.1046 21 12C21 10.8954 20.1046 10 19 10C17.8954 10 17 10.8954 17 12C17 13.1046 17.8954 14 19 14Z" fill="#4E4B66" fill-opacity="0.72" />
1159 <path d="M19 7C20.1046 7 21 6.10457 21 5C21 3.89543 20.1046 3 19 3C17.8954 3 17 3.89543 17 5C17 6.10457 17.8954 7 19 7Z" fill="#4E4B66" fill-opacity="0.72" />
1160 <path d="M19 21C20.1046 21 21 20.1046 21 19C21 17.8954 20.1046 17 19 17C17.8954 17 17 17.8954 17 19C17 20.1046 17.8954 21 19 21Z" fill="#4E4B66" fill-opacity="0.72" />
1161 </svg>
1162 <?php
1163 echo wp_kses_post( preg_replace( '/\\<span.*?>.*?\\<\\/span><\\/span>/s', '', $current_menu_item[0] ) );
1164 ?>
1165 </a>
1166
1167 <div class="accordion-body adminify_top_level_settings">
1168 <div class="tabs tabbable">
1169 <ul class="adminify-flex adminify-flex-center adminify-m-0 nav nav-tabs">
1170 <li class="nav-item active">
1171 <a class="nav-link is-clickable active" href="#tab-<?php
1172 echo esc_attr( $menu_id );
1173 ?>-1">
1174 <?php
1175 esc_html_e( 'Settings', 'adminify' );
1176 ?>
1177 </a>
1178 </li>
1179 <li class="nav-item" role="presentation">
1180 <a class="nav-link is-clickable" href="#tab-<?php
1181 echo esc_attr( $menu_id );
1182 ?>-2">
1183 <?php
1184 esc_html_e( 'Submenu', 'adminify' );
1185 ?>
1186 </a>
1187 </li>
1188 </ul>
1189 </div>
1190
1191 <div class="tab-content tab-panel panel adminify-p-4">
1192 <div id="tab-<?php
1193 echo esc_attr( $menu_id );
1194 ?>-1" class="tab-pane">
1195 <div class="menu-editor-form">
1196 <div class="columns">
1197 <div class="column">
1198 <label for="<?php
1199 echo esc_attr( $current_menu_item[2] );
1200 ?>">
1201 <?php
1202 esc_html_e( 'Rename as', 'adminify' );
1203 ?>
1204 </label>
1205 <input class="menu_setting" type="text" name="name" data-top-menu-id="<?php
1206 echo esc_attr( $menu_id );
1207 ?>" placeholder="<?php
1208 echo esc_attr( $current_menu_item[0] );
1209 ?>" value='<?php
1210 echo esc_attr( $name );
1211 ?>' />
1212 </div>
1213 <div class="column">
1214 <label for="<?php
1215 echo esc_attr( $current_menu_item[2] );
1216 ?>">
1217 <?php
1218 esc_html_e( 'Hidden For Rules', 'adminify' );
1219 ?>
1220 </label>
1221
1222 <div class="select is-small">
1223
1224 <?php
1225 echo $this->generate_user_rules_select_field( $menu_id, $disabled_for );
1226 ?>
1227
1228 </div>
1229 </div>
1230 </div>
1231
1232 <div class="columns">
1233 <!-- <div class="column">
1234 <label for="">
1235 <?php
1236 esc_html_e( 'Change Link', 'adminify' );
1237 ?>
1238 </label>
1239 <input class="menu_setting" name="link" type="url" placeholder="<?php
1240 esc_html_e( 'New link', 'adminify' );
1241 ?>" value="<?php
1242 echo esc_attr( ( $name_attr != ltrim( $link, '#' ) ? $link : '' ) );
1243 ?>" onchange="checkForLinkTarget(this)" >
1244
1245 <label for="external_link-<?php
1246 echo esc_attr( $name_attr );
1247 ?>">
1248 <?php
1249 esc_html_e( 'New Window?', 'adminify' );
1250 ?>
1251 <input class="menu_setting" id="external_link-<?php
1252 echo esc_attr( $name_attr );
1253 ?>" name="external_link" type="checkbox" value="0" <?php
1254 checked( (int) $external_link, 1 );
1255 ?> disabled>
1256
1257 </label>
1258 <script>
1259 function checkForLinkTarget(inputField) {
1260 var checkbox = inputField.closest('.column').querySelector('input[type="checkbox"]');
1261
1262 if (inputField.value.trim() !== "") {
1263 checkbox.disabled = false; // Enable checkbox if input is not empty
1264 } else {
1265 checkbox.disabled = true; // Disable checkbox if input is empty
1266 }
1267 }
1268 </script>
1269 </div> -->
1270
1271 <div class="column">
1272 <label for="">
1273 <?php
1274 esc_html_e( 'Change Link', 'adminify' );
1275 ?>
1276 </label>
1277 <input class="menu_setting" name="link" type="url"
1278 placeholder="<?php
1279 esc_html_e( 'New link', 'adminify' );
1280 ?>"
1281 value="<?php
1282 echo esc_attr( ( $name_attr != ltrim( $link, '#' ) ? $link : '' ) );
1283 ?>"
1284 oninput="checkForLinkTarget(this)">
1285 <div class="new-tab-settings" style="padding-top: 10px;">
1286 <label for="external_link-<?php
1287 echo esc_attr( $name_attr );
1288 ?>" style="display: flex; align-items: center; gap: 8px;">
1289
1290 <input class="menu_setting" id="external_link-<?php
1291 echo esc_attr( $name_attr );
1292 ?>"
1293 name="external_link" type="checkbox" value="1"
1294 <?php
1295 checked( (int) $external_link, 1 );
1296 ?> disabled style="margin-top: 0;" >
1297 <span><?php
1298 esc_html_e( 'New Window?', 'adminify' );
1299 ?></span>
1300 </label>
1301 </div>
1302
1303 <script>
1304 // Function to validate URL
1305 function isValidURL(url) {
1306 // Allow absolute URLs (with http:// or https://)
1307 var absolutePattern = /^(https?:\/\/)[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}.*$/;
1308
1309 // Allow relative URLs (starting with "/")
1310 var relativePattern = /^\/[a-zA-Z0-9-_\/]+$/;
1311
1312 return absolutePattern.test(url) || relativePattern.test(url);
1313 }
1314
1315
1316 function checkForLinkTarget(inputField) {
1317 var checkbox = inputField.closest('.column').querySelector('input[type="checkbox"]');
1318
1319 if (isValidURL(inputField.value.trim())) {
1320 checkbox.disabled = false; // Enable if URL is valid
1321 } else {
1322 checkbox.disabled = true; // Disable if invalid
1323 checkbox.checked = false; // Also uncheck if disabled
1324 }
1325 }
1326
1327 // Run on page load
1328 document.addEventListener("DOMContentLoaded", function() {
1329 document.querySelectorAll('.column input[name="link"]').forEach(function(inputField) {
1330 checkForLinkTarget(inputField);
1331 });
1332 });
1333 </script>
1334 </div>
1335
1336 <div class="column">
1337 <label for="">
1338 <?php
1339 esc_html_e( 'Set Custom Icon', 'adminify' );
1340 ?>
1341 </label>
1342 <div class="icon-picker-wrap wp-adminify-menu-icon-picker adminify-icon-picker-input icon-select-button is-clickable is-pulled-left">
1343 <ul class="icon-picker">
1344 <li class="icon-none" title="None"><i class="dashicons dashicons-dismiss"></i></li>
1345 <li class="select-icon <?php
1346 echo ( !empty( $icon ) && preg_match( '/http(s?)\\:\\/\\//i', $icon ) || empty( $icon ) && empty( $icons[$default_icons] ) ? 'custom-icon' : '' );
1347 ?>" title="Icon Library">
1348 <?php
1349 if ( !empty( $icon ) ) {
1350 if ( preg_match( '/http(s?)\\:\\/\\//i', $icon ) ) {
1351 $image = explode( ',', $icon );
1352 echo '<i class=""><img width="24" height="24" src=' . esc_url( $image[1] ) . ' ></i>';
1353 } else {
1354 ?>
1355 <i class="<?php
1356 echo esc_attr( $this->get_icon( esc_attr( $icon ), '' ) );
1357 ?>"></i>
1358 <?php
1359 }
1360 } else {
1361 $adminify_icon = WP_ADMINIFY_ASSETS_IMAGE . 'logos/menu-icon.svg';
1362 if ( empty( $icons[$default_icons] ) ) {
1363 echo '<i class=""><img width="24" height="24" src=' . esc_url( $adminify_icon ) . ' ></i>';
1364 } else {
1365 ?>
1366 <i class="<?php
1367 echo wp_kses_post( $this->get_icon( esc_attr( $icon ), $icons[$default_icons] ) );
1368 ?>"></i>
1369 <?php
1370 }
1371 }
1372 ?>
1373
1374 </li>
1375 <input type="hidden" class="menu_setting" name="icon" value="<?php
1376 echo esc_attr( $icon );
1377 ?>">
1378 </ul>
1379 </div>
1380 </div>
1381 </div>
1382 <div class='columns'>
1383 <?php
1384 $upgrade_pro = '';
1385 $separator_name_attr = '';
1386 $upgrade_pro = 'upgrade-pro';
1387 $separator_name_attr = Utils::adminify_upgrade_pro( 'Add Separator' );
1388 ?>
1389
1390 <div class='column <?php
1391 echo esc_attr( $upgrade_pro );
1392 ?>'>
1393 <label for="seperator-<?php
1394 echo esc_attr( $name_attr );
1395 ?>">
1396 <?php
1397 $separator_content = apply_filters( 'adminify/menu_editor/add_separator', $separator_name_attr, $separator );
1398 // Apply the filter
1399 echo $separator_content;
1400 ?>
1401 </label>
1402 </div>
1403 </div>
1404 </div>
1405 <?php
1406 if ( strpos( $current_menu_item[5], 'adminify-custom-menu-' ) !== false ) {
1407 ?>
1408 <div class="remove-add-new-menu"><span data-id="<?php
1409 echo esc_attr( $current_menu_item[5] );
1410 ?>"><i class="icon-close"></i> Delete</span></div>
1411 <?php
1412 }
1413 ?>
1414 </div>
1415 <div id="tab-<?php
1416 echo esc_attr( $menu_id );
1417 ?>-2" class="tab-pane tab-pane--submenu">
1418 <?php
1419 // Sub Menu Items Check
1420 $link = $current_menu_item[2];
1421 if ( isset( $master_sub_menu[$name_attr] ) && is_array( $master_sub_menu[$name_attr] ) ) {
1422 foreach ( $master_sub_menu[$name_attr] as $sub_menu_item ) {
1423 $this->build_sub_menu_item( $sub_menu_item, $optiongroup, $name_attr );
1424 }
1425 } else {
1426 ?>
1427 <span><?php
1428 esc_html_e( 'No sub menu items', 'adminify' );
1429 ?></span>
1430 <?php
1431 }
1432 $this->render_add_new_menu_item( true );
1433 // true for submenu item
1434 ?>
1435
1436 </div>
1437 </div>
1438
1439 </div>
1440 </div>
1441
1442 <?php
1443 }
1444
1445 public function render_menu_separator( $current_menu_item ) {
1446 $disabled_for = [];
1447 $name = '';
1448 $menu_id = preg_replace( '/[^A-Za-z0-9 ]/', '', $current_menu_item[2] );
1449 $menu_options = $this->menu_settings;
1450 if ( is_array( $menu_options ) ) {
1451 if ( isset( $menu_options[$current_menu_item[2]] ) ) {
1452 $optiongroup = $menu_options[$current_menu_item[2]];
1453 if ( isset( $optiongroup['name'] ) ) {
1454 $name = $optiongroup['name'];
1455 }
1456 if ( isset( $optiongroup['hidden_for'] ) ) {
1457 $disabled_for = $optiongroup['hidden_for'];
1458 }
1459 }
1460 }
1461 if ( !is_array( $disabled_for ) ) {
1462 $disabled_for = [];
1463 }
1464 ?>
1465 <div class="accordion adminify_menu_item" name="<?php
1466 echo esc_attr( $current_menu_item[2] );
1467 ?>" id="<?php
1468 echo esc_attr( $menu_id );
1469 ?>">
1470 <input type="number" class="top_level_order" value="" style="display:none;">
1471 <a class="menu-editor-title accordion-button p-4" href="#">
1472 <svg class="drag-icon is-pulled-left mr-2" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
1473 <path d="M12 14C13.1046 14 14 13.1046 14 12C14 10.8954 13.1046 10 12 10C10.8954 10 10 10.8954 10 12C10 13.1046 10.8954 14 12 14Z" fill="#4E4B66" fill-opacity="0.72" />
1474 <path d="M12 7C13.1046 7 14 6.10457 14 5C14 3.89543 13.1046 3 12 3C10.8954 3 10 3.89543 10 5C10 6.10457 10.8954 7 12 7Z" fill="#4E4B66" fill-opacity="0.72" />
1475 <path d="M12 21C13.1046 21 14 20.1046 14 19C14 17.8954 13.1046 17 12 17C10.8954 17 10 17.8954 10 19C10 20.1046 10.8954 21 12 21Z" fill="#4E4B66" fill-opacity="0.72" />
1476 <path d="M5 14C6.10457 14 7 13.1046 7 12C7 10.8954 6.10457 10 5 10C3.89543 10 3 10.8954 3 12C3 13.1046 3.89543 14 5 14Z" fill="#4E4B66" fill-opacity="0.72" />
1477 <path d="M5 7C6.10457 7 7 6.10457 7 5C7 3.89543 6.10457 3 5 3C3.89543 3 3 3.89543 3 5C3 6.10457 3.89543 7 5 7Z" fill="#4E4B66" fill-opacity="0.72" />
1478 <path d="M5 21C6.10457 21 7 20.1046 7 19C7 17.8954 6.10457 17 5 17C3.89543 17 3 17.8954 3 19C3 20.1046 3.89543 21 5 21Z" fill="#4E4B66" fill-opacity="0.72" />
1479 <path d="M19 14C20.1046 14 21 13.1046 21 12C21 10.8954 20.1046 10 19 10C17.8954 10 17 10.8954 17 12C17 13.1046 17.8954 14 19 14Z" fill="#4E4B66" fill-opacity="0.72" />
1480 <path d="M19 7C20.1046 7 21 6.10457 21 5C21 3.89543 20.1046 3 19 3C17.8954 3 17 3.89543 17 5C17 6.10457 17.8954 7 19 7Z" fill="#4E4B66" fill-opacity="0.72" />
1481 <path d="M19 21C20.1046 21 21 20.1046 21 19C21 17.8954 20.1046 17 19 17C17.8954 17 17 17.8954 17 19C17 20.1046 17.8954 21 19 21Z" fill="#4E4B66" fill-opacity="0.72" />
1482 </svg>
1483 <?php
1484 esc_html_e( 'Separator', 'adminify' );
1485 ?>
1486 </a>
1487
1488 <div class="accordion-body adminify_top_level_settings">
1489 <div class="tab-content tab-panel panel p-4">
1490 <div class="menu-editor-form">
1491 <div class="columns">
1492 <div class="column">
1493 <label for=""><?php
1494 esc_html_e( 'Rename as', 'adminify' );
1495 ?></label>
1496 <input class="menu_setting" type="text" name="name" placeholder="<?php
1497 esc_html_e( 'New Name', 'adminify' );
1498 ?>" value="<?php
1499 echo esc_attr( $name );
1500 ?>">
1501 </div>
1502 <div class="column">
1503 <label for=""><?php
1504 esc_html_e( 'Hidden For Rules', 'adminify' );
1505 ?></label>
1506
1507 <div class="select is-small">
1508 <?php
1509 echo $this->generate_user_rules_select_field( $menu_id, $disabled_for );
1510 ?>
1511
1512 <script>
1513 jQuery('#<?php
1514 echo esc_attr( $menu_id );
1515 ?> #<?php
1516 echo esc_attr( $menu_id );
1517 ?>-user-role-types').tokenize2({
1518 placeholder: '<?php
1519 esc_html_e( 'Select roles or users', 'adminify' );
1520 ?>'
1521 });
1522 jQuery(document).ready(function($) {
1523 $('#<?php
1524 echo esc_attr( $menu_id );
1525 ?> #<?php
1526 echo esc_attr( $menu_id );
1527 ?>-user-role-types').on('tokenize:select', function(container) {
1528 $(this).tokenize2().trigger('tokenize:search', [$(this).tokenize2().input.val()]);
1529 });
1530 })
1531 </script>
1532 </div>
1533 </div>
1534 </div>
1535 </div>
1536
1537 </div>
1538 </div>
1539 </div>
1540
1541 <?php
1542 }
1543
1544 public function build_sub_menu_item( $current_menu_item, $optiongroup, $name_attr ) {
1545 $name = '';
1546 $link = '';
1547 $icon = '';
1548 $external_link = '';
1549 $disabled_for = [];
1550 $suboptiongroup = [];
1551 $menu_options = $this->menu_settings;
1552 if ( isset( $optiongroup['submenu'] ) ) {
1553 if ( isset( $optiongroup['submenu'][$current_menu_item[2]] ) ) {
1554 $suboptiongroup = $optiongroup['submenu'][$current_menu_item[2]];
1555 if ( isset( $suboptiongroup['name'] ) ) {
1556 $name = $suboptiongroup['name'];
1557 }
1558 if ( isset( $suboptiongroup['link'] ) ) {
1559 $link = $suboptiongroup['link'];
1560 }
1561 if ( isset( $suboptiongroup['external_link'] ) ) {
1562 $external_link = $suboptiongroup['external_link'];
1563 }
1564 if ( isset( $suboptiongroup['icon'] ) ) {
1565 $icon = $suboptiongroup['icon'];
1566 }
1567 if ( isset( $suboptiongroup['hidden_for'] ) ) {
1568 $disabled_for = $suboptiongroup['hidden_for'];
1569 }
1570 }
1571 }
1572 $sub_menu_name_attr = $current_menu_item[2];
1573 if ( isset( $current_menu_item['key'] ) ) {
1574 $sub_menu_name_attr = $current_menu_item['key'];
1575 }
1576 if ( strpos( $sub_menu_name_attr, 'adminify-custom-submenu-' ) !== false ) {
1577 $name = $current_menu_item[0];
1578 $link = $current_menu_item[2];
1579 if ( isset( $optiongroup['submenu'][$sub_menu_name_attr]['hidden_for'] ) ) {
1580 $disabled_for = $optiongroup['submenu'][$sub_menu_name_attr]['hidden_for'];
1581 }
1582 if ( isset( $optiongroup['submenu'][$sub_menu_name_attr]['icon'] ) ) {
1583 $icon = $optiongroup['submenu'][$sub_menu_name_attr]['icon'];
1584 }
1585 if ( isset( $optiongroup['submenu'][$sub_menu_name_attr]['external_link'] ) ) {
1586 $external_link = $optiongroup['submenu'][$sub_menu_name_attr]['external_link'];
1587 }
1588 }
1589 if ( !is_array( $disabled_for ) ) {
1590 $disabled_for = [];
1591 }
1592 $menu_id = preg_replace( '/[^A-Za-z0-9 ]/', '', $sub_menu_name_attr );
1593 ?>
1594 <div class="accordion adminify_sub_menu_item" name="<?php
1595 echo esc_attr( $sub_menu_name_attr );
1596 ?>" id="wp-adminify-sub-menu-<?php
1597 echo esc_attr( $menu_id );
1598 ?>">
1599 <input type="number" class="top_level_order" value="" style="display:none;">
1600 <a class="menu-editor-title accordion-button adminify-flex adminify-flex-center adminify-gap-2" href="#">
1601 <svg class="drag-icon is-pulled-left mr-2" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
1602 <path d="M12 14C13.1046 14 14 13.1046 14 12C14 10.8954 13.1046 10 12 10C10.8954 10 10 10.8954 10 12C10 13.1046 10.8954 14 12 14Z" fill="#4E4B66" fill-opacity="0.72" />
1603 <path d="M12 7C13.1046 7 14 6.10457 14 5C14 3.89543 13.1046 3 12 3C10.8954 3 10 3.89543 10 5C10 6.10457 10.8954 7 12 7Z" fill="#4E4B66" fill-opacity="0.72" />
1604 <path d="M12 21C13.1046 21 14 20.1046 14 19C14 17.8954 13.1046 17 12 17C10.8954 17 10 17.8954 10 19C10 20.1046 10.8954 21 12 21Z" fill="#4E4B66" fill-opacity="0.72" />
1605 <path d="M5 14C6.10457 14 7 13.1046 7 12C7 10.8954 6.10457 10 5 10C3.89543 10 3 10.8954 3 12C3 13.1046 3.89543 14 5 14Z" fill="#4E4B66" fill-opacity="0.72" />
1606 <path d="M5 7C6.10457 7 7 6.10457 7 5C7 3.89543 6.10457 3 5 3C3.89543 3 3 3.89543 3 5C3 6.10457 3.89543 7 5 7Z" fill="#4E4B66" fill-opacity="0.72" />
1607 <path d="M5 21C6.10457 21 7 20.1046 7 19C7 17.8954 6.10457 17 5 17C3.89543 17 3 17.8954 3 19C3 20.1046 3.89543 21 5 21Z" fill="#4E4B66" fill-opacity="0.72" />
1608 <path d="M19 14C20.1046 14 21 13.1046 21 12C21 10.8954 20.1046 10 19 10C17.8954 10 17 10.8954 17 12C17 13.1046 17.8954 14 19 14Z" fill="#4E4B66" fill-opacity="0.72" />
1609 <path d="M19 7C20.1046 7 21 6.10457 21 5C21 3.89543 20.1046 3 19 3C17.8954 3 17 3.89543 17 5C17 6.10457 17.8954 7 19 7Z" fill="#4E4B66" fill-opacity="0.72" />
1610 <path d="M19 21C20.1046 21 21 20.1046 21 19C21 17.8954 20.1046 17 19 17C17.8954 17 17 17.8954 17 19C17 20.1046 17.8954 21 19 21Z" fill="#4E4B66" fill-opacity="0.72" />
1611 </svg>
1612 <?php
1613 if ( !empty( $current_menu_item[0] ) ) {
1614 echo wp_kses_post( preg_replace( '/\\<span.*?>.*?\\<\\/span><\\/span>/s', '', $current_menu_item[0] ) );
1615 }
1616 ?>
1617 </a>
1618
1619 <div class="accordion-body">
1620 <div class="tab-content tab-panel panel p-4">
1621 <div class="tab-pane">
1622 <div class="menu-editor-form">
1623 <div class="columns">
1624 <div class="column">
1625 <label for=""><?php
1626 esc_html_e( 'Rename as', 'adminify' );
1627 ?></label>
1628 <input class="sub_menu_setting" type="text" data-sub-menu-id="<?php
1629 echo esc_attr( $menu_id );
1630 ?>" name="name" placeholder="<?php
1631 esc_html_e( 'New Menu name...', 'adminify' );
1632 ?>" value="<?php
1633 echo esc_attr( $name );
1634 ?>">
1635 </div>
1636 <div class="column">
1637 <label for=""><?php
1638 esc_html_e( 'Hidden For Rules', 'adminify' );
1639 ?></label>
1640
1641 <div class="select is-small">
1642
1643 <?php
1644 echo $this->generate_user_rules_select_field( $menu_id, $disabled_for, 'sub_menu' );
1645 ?>
1646
1647 <script>
1648 jQuery('#wp-adminify-sub-menu-<?php
1649 echo esc_attr( $menu_id );
1650 ?> #<?php
1651 echo esc_attr( $menu_id );
1652 ?>-user-role-types').tokenize2({
1653 placeholder: '<?php
1654 esc_html_e( 'Select roles or users', 'adminify' );
1655 ?>'
1656 });
1657 jQuery(document).ready(function($) {
1658 $('#wp-adminify-sub-menu-<?php
1659 echo esc_attr( $menu_id );
1660 ?> #<?php
1661 echo esc_attr( $menu_id );
1662 ?>-user-role-types').on('tokenize:select', function(container) {
1663 $(this).tokenize2().trigger('tokenize:search', [$(this).tokenize2().input.val()]);
1664 });
1665 })
1666 </script>
1667
1668 </div>
1669 </div>
1670 </div>
1671 <div class="columns">
1672 <div class="column">
1673 <label for=""><?php
1674 esc_html_e( 'Change Link', 'adminify' );
1675 ?></label>
1676 <input class="sub_menu_setting" name="link" type="url" placeholder="New link" value="<?php
1677 echo esc_attr( ( $sub_menu_name_attr != ltrim( $link, '#' ) ? $link : '' ) );
1678 ?>" onchange="checkForLinkTarget(this)" >
1679
1680 <label for="external_link-<?php
1681 echo esc_attr( $sub_menu_name_attr );
1682 ?>">
1683 <?php
1684 esc_html_e( 'New Window?', 'adminify' );
1685 ?>
1686 <input class="sub_menu_setting" id="external_link-<?php
1687 echo esc_attr( $sub_menu_name_attr );
1688 ?>" name="external_link" type="checkbox" value="0" <?php
1689 checked( (int) $external_link, 1 );
1690 ?>disabled />
1691
1692 </label>
1693 </div>
1694 <div class="column">
1695 <label for="" style="margin-top:25px">
1696 <?php
1697 esc_html_e( 'Custom Icon is not allowed for Submenu', 'adminify' );
1698 ?>
1699 </label>
1700 </div>
1701 </div>
1702 </div>
1703 <?php
1704 if ( strpos( $sub_menu_name_attr, 'adminify-custom-submenu-' ) !== false ) {
1705 ?>
1706 <div class="remove-add-new-menu"><span data-id="<?php
1707 echo esc_attr( $sub_menu_name_attr );
1708 ?>"><i class="icon-close"></i> Delete</span></div>
1709 <?php
1710 }
1711 ?>
1712 </div>
1713 </div>
1714 </div>
1715 </div>
1716
1717 <?php
1718 }
1719
1720 /**
1721 * Add New Menu Item.
1722 */
1723 public function render_add_new_menu_item( $submenu = false ) {
1724 $add_item = apply_filters( 'adminify/menu_editor', [
1725 'upgrade_pro' => Utils::adminify_upgrade_pro( ' ' ),
1726 'upgrade_class' => 'upgrade-pro',
1727 ] );
1728 ?>
1729 <div class="adminify-accordion adminify-add-new-menu-editor-item upgrade-pro adminify-field adminify-field-switcher adminify-depend-visible adminify-depend-on adminify-pro-notice <?php
1730 echo esc_attr( ( $submenu ? 'submenu' : '' ) );
1731 ?> <?php
1732 echo Utils::wp_kses_custom( $add_item['upgrade_class'] );
1733 ?>">
1734 <div class="inner-text">
1735 <i class="dashicons dashicons-plus-alt"></i>
1736 <span class="title"><?php
1737 esc_html_e( 'Add Item', 'adminify' );
1738 ?></span>
1739 </div>
1740 <?php
1741 echo Utils::wp_kses_custom( $add_item['upgrade_pro'] );
1742 ?>
1743 </div>
1744 <?php
1745 }
1746
1747 /**
1748 * Menu Editor Header
1749 *
1750 * @return void
1751 */
1752 public static function render_menu_editor_header() {
1753 ?>
1754
1755 <div class="adminify-flex adminify-flex-center adminify-justify-between">
1756 <div class="adminify-menu-editor-help-urls adminify-flex adminify-flex-center adminify-gap-2">
1757 <?php
1758 echo Utils::adminfiy_help_urls(
1759 __( 'Menu Editor', 'adminify' ),
1760 'https://wpadminify.com/kb/wordpress-dashboard-menu-editor/',
1761 'https://www.youtube.com/playlist?list=PLqpMw0NsHXV-EKj9Xm1DMGa6FGniHHly8',
1762 'https://www.facebook.com/groups/jeweltheme',
1763 \WPAdminify\Inc\Admin\AdminSettings::support_url()
1764 );
1765 ?>
1766 </div>
1767
1768
1769 <div class="wp-adminify--page--title--actions adminify-flex adminify-flex-center adminify-gap-2">
1770
1771 <button class="adminify-btn adminify-btn-outline-primary adminify_menu_save_settings">
1772 <?php
1773 esc_html_e( 'Save', 'adminify' );
1774 ?>
1775 </button>
1776
1777 <div class="adminify-dropdown">
1778 <div class="adminify-dropdown-trigger">
1779 <button class="adminify-btn adminify-btn-outline-primary" aria-haspopup="true" aria-controls="dropdown-menu">
1780 <svg class="icon" width="16" height="12" viewBox="0 0 16 12" fill="none" xmlns="http://www.w3.org/2000/svg">
1781 <path d="M5 12C3.63144 12.0007 2.43589 11.0751 2.09375 9.75H0.5V8.25H2.0945C2.48423 6.74059 3.96509 5.78119 5.50196 6.04243C7.03883 6.30366 8.11953 7.69847 7.98865 9.25188C7.85776 10.8053 6.55892 11.9996 5 12ZM5 7.5C4.18055 7.50083 3.51342 8.15914 3.50167 8.97851C3.48993 9.79788 4.13792 10.475 4.95702 10.4993C5.77611 10.5237 6.46312 9.88613 6.5 9.0675V9.3675V9C6.5 8.17158 5.82843 7.5 5 7.5ZM15.5 9.75H8.75V8.25H15.5V9.75ZM8.75 6C7.38172 6.00035 6.18657 5.07483 5.8445 3.75H0.5V2.25H5.8445C6.23423 0.740588 7.71509 -0.218809 9.25196 0.0424253C10.7888 0.30366 11.8695 1.69847 11.7386 3.25188C11.6078 4.80529 10.3089 5.99961 8.75 6ZM8.75 1.5C7.93055 1.50083 7.26342 2.15914 7.25167 2.97851C7.23993 3.79788 7.88792 4.47503 8.70702 4.49934C9.52611 4.52365 10.2131 3.88613 10.25 3.0675V3.3675V3C10.25 2.17158 9.57843 1.5 8.75 1.5ZM15.5 3.75H12.5V2.25H15.5V3.75Z" fill="#0347FF" />
1782 </svg>
1783 </button>
1784 </div>
1785 <div class="adminify-dropdown-menu" id="dropdown-menu" role="menu">
1786 <div class="adminify-dropdown-content adminify-flex adminify-flex-col adminify-gap-2">
1787 <a href="#" class="adminify-dropdown-item adminify_export_menu_settings">
1788 <?php
1789 esc_html_e( 'Export menu', 'adminify' );
1790 ?>
1791 </a>
1792 <input accept=".json" type="file" single="" id="adminify_import_menu" class="hidden">
1793 <a href="#" class="adminify-dropdown-item adminify_import_menu_settings">
1794 <?php
1795 esc_html_e( 'Import menu', 'adminify' );
1796 ?>
1797 </a>
1798 <a href="#" class="adminify-dropdown-item adminify_reset_menu_settings">
1799 <?php
1800 esc_html_e( 'Reset menu', 'adminify' );
1801 ?>
1802 </a>
1803 </div>
1804 </div>
1805 </div>
1806 </div>
1807 </div>
1808
1809 <div class="adminify-text-wrap">
1810 <p><?php
1811 esc_html_e( 'Edit each menu item\'s name, link, icon and visibility. Drag and drop to rearange the menu. Changes will take effect after page refresh.', 'adminify' );
1812 ?></p>
1813 <p class="adminify-flex adminify-flex-center adminify-gap-1">
1814 <svg class="" width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
1815 <path d="M7.33398 7.32002C7.33398 7.14321 7.40422 6.97364 7.52925 6.84861C7.65427 6.72359 7.82384 6.65335 8.00065 6.65335C8.17746 6.65335 8.34703 6.72359 8.47206 6.84861C8.59708 6.97364 8.66732 7.14321 8.66732 7.32002V11.32C8.66732 11.4968 8.59708 11.6664 8.47206 11.7914C8.34703 11.9164 8.17746 11.9867 8.00065 11.9867C7.82384 11.9867 7.65427 11.9164 7.52925 11.7914C7.40422 11.6664 7.33398 11.4968 7.33398 11.32V7.32002Z" fill="#4E4B66" />
1816 <path d="M8.00065 4.034C7.82384 4.034 7.65427 4.10423 7.52925 4.22926C7.40422 4.35428 7.33398 4.52385 7.33398 4.70066C7.33398 4.87747 7.40422 5.04704 7.52925 5.17207C7.65427 5.29709 7.82384 5.36733 8.00065 5.36733C8.17746 5.36733 8.34703 5.29709 8.47206 5.17207C8.59708 5.04704 8.66732 4.87747 8.66732 4.70066C8.66732 4.52385 8.59708 4.35428 8.47206 4.22926C8.34703 4.10423 8.17746 4.034 8.00065 4.034Z" fill="#4E4B66" />
1817 <path fill-rule="evenodd" clip-rule="evenodd" d="M8.00065 1.33334C4.31865 1.33334 1.33398 4.31801 1.33398 8.00001C1.33398 11.682 4.31865 14.6667 8.00065 14.6667C11.6827 14.6667 14.6673 11.682 14.6673 8.00001C14.6673 4.31801 11.6827 1.33334 8.00065 1.33334ZM2.66732 8.00001C2.66732 9.4145 3.22922 10.7711 4.22942 11.7712C5.22961 12.7714 6.58616 13.3333 8.00065 13.3333C9.41514 13.3333 10.7717 12.7714 11.7719 11.7712C12.7721 10.7711 13.334 9.4145 13.334 8.00001C13.334 6.58552 12.7721 5.22897 11.7719 4.22877C10.7717 3.22858 9.41514 2.66668 8.00065 2.66668C6.58616 2.66668 5.22961 3.22858 4.22942 4.22877C3.22922 5.22897 2.66732 6.58552 2.66732 8.00001V8.00001Z" fill="#4E4B66" />
1818 </svg>
1819
1820 <?php
1821 esc_html_e( 'If you have WP Adminify Menu Module disabled, icons and label dividers won\'t change.', 'adminify' );
1822 ?>
1823
1824 </p>
1825 </div>
1826
1827
1828 <?php
1829 }
1830
1831 public function jltwp_adminify_menu_editor_contents() {
1832 ?>
1833
1834 <div class="wrap">
1835 <div class="wp-adminify--menu--editor--container">
1836
1837 <!-- <div id="adminify-data-saved-message"></div> -->
1838
1839 <?php
1840 //self::render_menu_editor_header();
1841 ?>
1842
1843 <div class="wp-adminify--menu--editor--settings adminify-flex adminify-flex-col adminify-gap-4">
1844 <div class="wp-adminify-menu-editor-loader"></div>
1845 <?php
1846 $this->render_menu_editor();
1847 ?>
1848 </div>
1849
1850 </div>
1851 </div>
1852 <a href="#" id="adminify_download_settings" style="display: none;" ?></a>
1853 <?php
1854 }
1855
1856 }
1857
1858 }