PluginProbe
Timetics – Appointment Booking Calendar & Scheduling / 1.0.64
Timetics – Appointment Booking Calendar & Scheduling v1.0.64
1.0.64 1.0.62 1.0.63 1.0.61 1.0.60 1.0.59 1.0.58 1.0.57 1.0.56 trunk 1.0.0 1.0.1 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.15 1.0.16 1.0.17 1.0.18 1.0.19 1.0.2 1.0.20 1.0.21 All 65 releases
← All changes | core/admin/menu.php +102 -31 1.0.1 → 1.0.64 View file →
@@ -7,12 +7,15 @@
7 7 */
8 8
9 9 namespace Timetics\Core\Admin;
10 10
11 +defined( 'ABSPATH' ) || exit;
12 +
11 13 /**
12 14 * Class Menu
13 15 */
14 -class Menu {
16 +class Menu
17 +{
15 18
16 19 use \Timetics\Utils\Singleton;
17 20
18 21 /**
@@ -19,12 +22,16 @@
19 22 * Initialize
20 23 *
21 24 * @return void
22 25 */
23 - public function init() {
24 - add_action( 'admin_menu', array( $this, 'register_admin_menu' ) );
26 + public function init()
27 + {
28 + add_action('admin_menu', array($this, 'register_admin_menu'));
29 +
30 + add_action('timetics_menu', array($this, 'add_pro_admin_menu'));
25 31 }
26 32
33 +
27 34 /**
28 35 * Register admin menu
29 36 *
30 37 * @return void
@@ -29,9 +36,10 @@
29 36 *
30 37 * @return void
31 38 */
32 39
33 - public function register_admin_menu() {
40 + public function register_admin_menu()
41 + {
34 42 global $submenu;
35 43 $capability = 'manage_timetics';
36 44 $slug = 'timetics';
37 45 $url = 'admin.php?page=' . $slug . '#';
@@ -36,64 +44,108 @@
36 44 $slug = 'timetics';
37 45 $url = 'admin.php?page=' . $slug . '#';
38 46 $menu_items = array(
39 47 [
40 - 'title' => __( 'Overview', 'timetics' ),
48 + 'id' => 'overview',
49 + 'title' => esc_html__('Overview', 'timetics'),
41 50 'link' => '/',
42 - 'capability' => $capability,
51 + 'capability' => apply_filters('timetics_menu_permission_overview', $capability),
52 + 'position' => apply_filters('timetics_menu_position_overview', 1),
43 53 ],
44 54 [
45 - 'title' => __( 'Meetings', 'timetics' ),
55 + 'id' => 'ask-ai',
56 + 'title' => esc_html__('Ask AI', 'timetics'),
57 + 'link' => '/ask-ai',
58 + // Staff cannot set Aisentic up, so they only get the page once the assistant is ready.
59 + 'capability' => apply_filters('timetics_menu_permission_ask_ai', class_exists('Aisentic\Init') && timetics_aisentic_is_registered() ? $capability : 'manage_options'),
60 + 'position' => apply_filters('timetics_menu_position_ask_ai', 1.2),
61 + ],
62 + [
63 + 'id' => 'meeting',
64 + 'title' => esc_html__('Meetings', 'timetics'),
46 65 'link' => '/meetings',
47 - 'capability' => 'read_booking',
66 + 'capability' => apply_filters('timetics_menu_permission_meeting', 'read_booking'),
67 + 'position' => apply_filters('timetics_menu_position_meeting', 2),
48 68 ],
49 69 [
50 - 'title' => __( 'Staffs', 'timetics' ),
70 + 'id' => 'staff',
71 + 'title' => esc_html__('Team Members', 'timetics'),
51 72 'link' => '/staff',
52 - 'capability' => 'edit_staff',
73 + 'capability' => apply_filters('timetics_menu_permission_staff', 'edit_staff'),
74 + 'position' => apply_filters('timetics_menu_position_staff', 3),
53 75 ],
54 76
55 77 [
56 - 'title' => __( 'Bookings', 'timetics' ),
78 + 'id' => 'booking',
79 + 'title' => esc_html__('Calendar', 'timetics'),
57 80 'link' => '/bookings',
58 - 'capability' => 'read_booking',
81 + 'capability' => apply_filters('timetics_menu_permission_booking', 'read_booking'),
82 + 'position' => apply_filters('timetics_menu_position_booking', 1.5),
59 83 ],
60 84 [
61 - 'title' => __( 'Customers', 'timetics' ),
85 + 'id' => 'customer',
86 + 'title' => esc_html__('Customers', 'timetics'),
62 87 'link' => '/customers',
63 - 'capability' => 'manage_options',
88 + 'capability' => apply_filters('timetics_menu_permission_customer', 'manage_options'),
89 + 'position' => apply_filters('timetics_menu_position_customer', 5),
64 90 ],
65 91 [
66 - 'title' => __( 'Settings', 'timetics' ),
92 + 'id' => 'settings',
93 + 'title' => esc_html__('Settings', 'timetics'),
67 94 'link' => '/settings',
68 - 'capability' => 'manage_options',
95 + 'capability' => apply_filters('timetics_menu_permission_settings', 'manage_options'),
96 + 'position' => apply_filters('timetics_menu_position_settings', 6),
69 97 ],
70 98 [
71 - 'title' => __( 'My Profile', 'timetics' ),
99 + 'id' => 'my-profile',
100 + 'title' => esc_html__('My Profile', 'timetics'),
72 101 'link' => '/my-profile',
73 - 'capability' => 'edit_profile',
102 + 'capability' => apply_filters('timetics_menu_permission_my_profile', 'edit_profile'),
103 + 'position' => apply_filters('timetics_menu_position_my_profile', 7),
74 104 ],
75 105 [
76 - 'title' => __( 'Shortcodes', 'timetics' ),
106 + 'id' => 'shortcode',
107 + 'title' => esc_html__('Shortcodes', 'timetics'),
77 108 'link' => '/shortcodes',
78 - 'capability' => 'edit_profile',
109 + 'capability' => apply_filters('timetics_menu_permission_shortcode', 'manage_options'),
110 + 'position' => apply_filters('timetics_menu_position_shortcode', 8),
79 111 ],
112 + [
113 + 'id' => 'onboard',
114 + 'title' => esc_html__('Setup Wizard', 'timetics'),
115 + 'link' => '/onboard',
116 + 'capability' => apply_filters('timetics_menu_permission_onboard', 'manage_options'),
117 + 'position' => apply_filters('timetics_menu_position_onboard', 9),
118 + ],
119 + [
120 + 'id' => 'about-us',
121 + 'title' => esc_html__('About Us', 'timetics'),
122 + 'link' => '/about-us',
123 + 'capability' => apply_filters('timetics_menu_permission_about_us', 'manage_options'),
124 + 'position' => apply_filters('timetics_menu_position_about_us', 10),
125 + ],
80 126 );
81 127
82 128 add_menu_page(
83 - __( 'Timetics', 'timetics' ),
84 - __( 'Timetics', 'timetics' ),
129 + esc_html__('Timetics', 'timetics'),
130 + esc_html__('Timetics', 'timetics'),
85 131 $capability,
86 132 $slug,
87 - array( $this, 'timetics_dashboard_view' ),
88 - 'dashicons-store',
133 + array($this, 'timetics_dashboard_view'),
134 + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzE0MjhfMTE1OSkiPgo8cGF0aCBkPSJNOC42NDc0NSAxMy40NTEyQzUuMTc5MjQgMTMuNDUxMiAyLjQwNDY3IDEwLjY2NjcgMi43OTc3NCA3LjM4OTY0QzMuMDk4MzIgNC44MTkzNiA1LjM2NDIxIDIuNzg0NTUgOC4xMzg3OCAyLjU3MDM2QzkuOTQyMjUgMi40NDE4NSAxMS42MDcgMy4wNjMgMTIuNzYzMSA0LjEzMzk1TDE0Ljc3NDYgMi4zNzc1OUMxMy4wODY4IDAuNzkyNTg1IDEwLjcwNTMgLTAuMTI4NDMyIDguMDkyNTQgMC4wMjE1MDA3QzMuODE1MDggMC4yNTcxMSAwLjMyMzc0OSAzLjQ2OTk2IDAuMDIzMTcwNiA3LjQzMjQ4Qy0wLjMyMzY1IDEyLjEwMTggMy42NzYzNSAxNi4wMDAxIDguNjQ3NDUgMTYuMDAwMUMxMC41MjAzIDE2LjAwMDEgMTIuMjMxMyAxNS40NDMyIDEzLjY0MTcgMTQuNTIyMkMxNC4zMzUzIDE0LjA3MjQgMTQuNDA0NyAxMy4xNTE0IDEzLjgwMzUgMTIuNTk0NUwxMy43ODA0IDEyLjU3M0MxMy4yOTQ4IDEyLjEyMzIgMTIuNTU1IDEyLjEwMTggMTIuMDAwMSAxMi40NDQ1QzExLjA1MjEgMTMuMDg3MSA5Ljg5NiAxMy40NTEyIDguNjQ3NDUgMTMuNDUxMloiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik04LjY0NzQ1IDEzLjQ1MTJDNS4xNzkyNCAxMy40NTEyIDIuNDA0NjcgMTAuNjY2NyAyLjc5Nzc0IDcuMzg5NjRDMy4wOTgzMiA0LjgxOTM2IDUuMzY0MjEgMi43ODQ1NSA4LjEzODc4IDIuNTcwMzZDOS45NDIyNSAyLjQ0MTg1IDExLjYwNyAzLjA2MyAxMi43NjMxIDQuMTMzOTVMMTQuNzc0NiAyLjM3NzU5QzEzLjA4NjggMC43OTI1ODUgMTAuNzA1MyAtMC4xMjg0MzIgOC4wOTI1NCAwLjAyMTUwMDdDMy44MTUwOCAwLjI1NzExIDAuMzIzNzQ5IDMuNDY5OTYgMC4wMjMxNzA2IDcuNDMyNDhDLTAuMzIzNjUgMTIuMTAxOCAzLjY3NjM1IDE2LjAwMDEgOC42NDc0NSAxNi4wMDAxQzEwLjUyMDMgMTYuMDAwMSAxMi4yMzEzIDE1LjQ0MzIgMTMuNjQxNyAxNC41MjIyQzE0LjMzNTMgMTQuMDcyNCAxNC40MDQ3IDEzLjE1MTQgMTMuODAzNSAxMi41OTQ1TDEzLjc4MDQgMTIuNTczQzEzLjI5NDggMTIuMTIzMiAxMi41NTUgMTIuMTAxOCAxMi4wMDAxIDEyLjQ0NDVDMTEuMDUyMSAxMy4wODcxIDkuODk2IDEzLjQ1MTIgOC42NDc0NSAxMy40NTEyWiIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyXzE0MjhfMTE1OSkiLz4KPHBhdGggZD0iTTE0LjQyNzggMi4wNzc1M0MxNC4yMTk3IDEuOTA2MTggMTMuOTg4NSAxLjcxMzQxIDEzLjc1NzMgMS41NjM0OEMxMy45MTkxIDEuODIwNSAxNC4wMTE2IDIuMTIwMzcgMTQuMDExNiAyLjQyMDI0QzE0LjAxMTYgMi44MjcyIDEzLjgwMzUgMy4yMzQxNiAxMy40Nzk4IDMuNTEyNjFMMTIuNzg2MiA0LjExMjM0TDguNTc4MDggNy44MTc4M0w3LjA5ODMxIDYuNDQ3MDFDNi41ODk2NCA1Ljk3NTc5IDUuNzU3MjcgNS44OTAxMiA1LjIwMjM2IDYuMzE4NUM0LjU1NDk2IDYuODExMTMgNC41MzE4NCA3LjY4OTMxIDUuMTA5ODcgOC4yMDMzN0w3LjU4Mzg2IDEwLjQ5NTJDNy44NjEzMiAxMC43NTIyIDguMjA4MTQgMTAuODU5MyA4LjU1NDk2IDEwLjg1OTNDOC45MDE3OCAxMC44NTkzIDkuMjQ4NiAxMC43NTIyIDkuNTAyOTQgMTAuNTE2NkwxNC4yNDI4IDYuMzM5OTJMMTUuNTYwNyA1LjE4MzI5QzE2LjA2OTQgNC43MzM0OSAxNi4xNjE5IDQuMDA1MjQgMTUuNzY4OCAzLjQ0ODM1QzE1LjQ2ODMgMy4wODQyMyAxNC44NDQgMi4zOTg4MiAxNC40Mjc4IDIuMDc3NTNaIiBmaWxsPSIjRTlGMkZGIi8+CjwvZz4KPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl8xNDI4XzExNTkiIHgxPSIxMy45ODg4IiB5MT0iMC45NDY1NTYiIHgyPSI5LjI0NzY4IiB5Mj0iNS42NDI5OCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMEMzOTc1IiBzdG9wLW9wYWNpdHk9IjAuMzgiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMzE2MUYxIiBzdG9wLW9wYWNpdHk9IjAiLz4KPC9saW5lYXJHcmFkaWVudD4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xNDI4XzExNTkiPgo8cmVjdCB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIGZpbGw9IndoaXRlIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+Cg==",
89 135 10
90 136 );
91 137
92 - $menu_items = apply_filters( 'timetics_menu', $menu_items );
138 + $menu_items = apply_filters('timetics_menu', $menu_items);
139 + $position = array_column($menu_items, 'position');
93 140
94 - foreach ( $menu_items as $item ) {
95 - $submenu[$slug][] = [$item['title'], $item['capability'], $url . $item['link']]; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
141 + array_multisort($position, SORT_ASC, $menu_items);
142 +
143 + foreach ($menu_items as $item) {
144 + $external = !empty($item['external_link']) ? $item['external_link'] : false;
145 +
146 + $link = !$external ? $url . $item['link'] : $item['link'];
147 + $submenu[$slug][] = [$item['title'], $item['capability'], $link]; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
96 148 }
97 149 }
98 150
99 151 /**
@@ -100,12 +152,31 @@
100 152 * Admin dashboard view
101 153 *
102 154 * @return void
103 155 */
104 - public function timetics_dashboard_view() {
105 - ?>
156 + public function timetics_dashboard_view()
157 + {
158 +?>
106 159 <div class="wrap" id="time_tics_dashboard">
107 - <h2>Timetics</h2>
108 160 </div>
109 - <?php
161 +<?php
162 + }
163 +
164 + // Add submenu page under "Settings"
165 + public function add_pro_admin_menu($menu_items)
166 + {
167 + if (class_exists('TimeticsPro')) {
168 + return $menu_items;
169 + }
170 +
171 + $menu_items[] = [
172 + 'id' => 'go-pro',
173 + 'title' => esc_html__('Go Pro', 'timetics'),
174 + 'link' => 'https://arraytics.com/timetics',
175 + 'external_link' => true,
176 + 'capability' => 'manage_options',
177 + 'position' => 9,
178 + ];
179 +
180 + return $menu_items;
110 181 }
111 182 }