PluginProbe
Adminify – White Label, Admin Menu Editor, Login Customizer / 4.0.5.4
Adminify – White Label, Admin Menu Editor, Login Customizer v4.0.5.4
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.5.4, at Inc/Modules/MenuEditor/MenuEditor.php

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