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

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