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

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