PluginProbe ʕ •ᴥ•ʔ
Booking for Appointments and Events Calendar – Amelia / 2.4.4
Booking for Appointments and Events Calendar – Amelia v2.4.4
2.4.4 2.4.3 2.4.2 2.4.1 2.4 trunk 1.2.1 1.2.10 1.2.11 1.2.12 1.2.13 1.2.14 1.2.15 1.2.16 1.2.17 1.2.18 1.2.19 1.2.2 1.2.20 1.2.21 1.2.22 1.2.23 1.2.24 1.2.25 1.2.26 1.2.27 1.2.28 1.2.29 1.2.3 1.2.30 1.2.31 1.2.32 1.2.33 1.2.34 1.2.35 1.2.36 1.2.37 1.2.38 1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 2.0 2.0.1 2.0.2 2.1 2.1.1 2.1.2 2.1.3 2.2 2.2.1 2.3
ameliabooking / src / Infrastructure / WP / WPMenu / Submenu.php
ameliabooking / src / Infrastructure / WP / WPMenu Last commit date
AdminBarMenu.php 3 months ago Submenu.php 3 months ago SubmenuPageHandler.php 3 weeks ago
Submenu.php
188 lines
1 <?php
2
3 namespace AmeliaBooking\Infrastructure\WP\WPMenu;
4
5 use AmeliaBooking\Infrastructure\Licence\Licence;
6
7 /**
8 * Class Submenu
9 *
10 * @package AmeliaBooking\Infrastructure\WPMenu
11 */
12 class Submenu
13 {
14 /** @var SubmenuPageHandler $submenuHandler */
15 private $submenuHandler;
16
17 /** @var array $menu */
18 private $menu;
19
20 /**
21 * Submenu constructor.
22 *
23 * @param SubmenuPageHandler $submenuHandler
24 * @param array $menu
25 */
26 public function __construct($submenuHandler, $menu)
27 {
28 $this->submenuHandler = $submenuHandler;
29
30 $this->menu = $menu;
31 }
32
33 /**
34 * Add options in WP menu
35 */
36 public function addOptionsPages()
37 {
38 add_menu_page(
39 'Amelia Booking',
40 'Amelia',
41 'amelia_read_menu',
42 'amelia',
43 '',
44 AMELIA_URL . 'public/img/amelia-logo-admin-icon.svg'
45 );
46
47 foreach ($this->menu as $menu) {
48 $this->handleMenuItem($menu);
49 }
50
51 $this->addSubmenuPage(
52 'amelia',
53 'Welcome',
54 'Welcome',
55 'amelia_read_menu',
56 'wpamelia-welcome',
57 function () {
58 $this->submenuHandler->render('wpamelia-welcome');
59 }
60 );
61
62 remove_submenu_page('amelia', 'amelia');
63
64 add_action('admin_head', function () {
65 remove_submenu_page('amelia', 'wpamelia-welcome');
66 });
67
68 if (!Licence::isPremium() && current_user_can('manage_options')) {
69 $this->addUpgradeMenuItem();
70 }
71 }
72
73 private function addUpgradeMenuItem()
74 {
75 $upgradeUrl = 'https://wpamelia.com/pricing/?utm_source=lite&utm_medium=dashboard&utm_content=amelia&utm_campaign=amelia-utm';
76
77 $this->addSubmenuPage(
78 'amelia',
79 '',
80 esc_html__('Upgrade', 'wpamelia'),
81 'amelia_read_menu',
82 'wpamelia-upgrade',
83 '__return_null'
84 );
85
86 add_action('admin_init', function () use ($upgradeUrl) {
87 $page = isset($_GET['page']) ? sanitize_key($_GET['page']) : '';
88
89 if ('wpamelia-upgrade' === $page) {
90 wp_redirect($upgradeUrl);
91 exit;
92 }
93 });
94
95 add_action('admin_enqueue_scripts', function () {
96 wp_enqueue_style(
97 'amelia-admin-menu',
98 AMELIA_URL . 'public/css/backend/admin-menu.css',
99 [],
100 AMELIA_VERSION
101 );
102
103 wp_enqueue_script(
104 'amelia-admin-menu',
105 AMELIA_URL . 'public/js/backend/admin-menu.js',
106 ['jquery'],
107 AMELIA_VERSION,
108 true
109 );
110 });
111 }
112
113 /**
114 * Get the inline SVG diamond icon for locked features
115 *
116 * @return string
117 */
118 private function getDiamondIcon()
119 {
120 return '<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" '
121 . 'style="width: 17px; height: 16px; margin-left: 8px; vertical-align: middle; display: inline-block;">'
122 // phpcs:ignore Generic.Files.LineLength
123 . '<path fill="currentColor" d="M17.166 1c.113 0 .308-.006.498.046.149.04.29.107.415.195.16.114.28.27.352.357l4.84 5.869c.077.094.162.197.228.291.054.076.113.17.16.284l.041.122.037.178c.025.18.013.363-.037.54a1.32 1.32 0 0 1-.2.405 5.2 5.2 0 0 1-.23.291L13.265 21.712c-.11.133-.222.27-.327.377a1.316 1.316 0 0 1-.486.33 1.305 1.305 0 0 1-.903 0 1.327 1.327 0 0 1-.487-.33c-.105-.107-.217-.244-.327-.377L.73 9.577c-.078-.094-.163-.196-.23-.29a1.32 1.32 0 0 1-.2-.406 1.32 1.32 0 0 1 0-.717l.042-.122c.046-.114.105-.208.159-.284.066-.094.15-.197.229-.291l4.84-5.87c.072-.087.19-.242.35-.356l.098-.062c.099-.058.206-.103.317-.133.19-.052.386-.046.499-.046h10.332ZM12 19.198l3.416-9.925H8.584L12 19.198Zm-1.725-.402L6.997 9.273H2.422l7.853 9.523Zm3.449 0 7.854-9.523h-4.575l-3.28 9.523ZM17.01 7.773h4.568l-4.305-5.221-.043-.052h-1.959l1.739 5.273Zm-8.44 0h6.86L13.692 2.5H10.31L8.57 7.773ZM6.77 2.5l-.043.052-4.305 5.22H6.99L8.73 2.5H6.77Z"/>'
124 . '</svg>';
125 }
126
127 public function handleMenuItem(array $menu)
128 {
129 if (!isset($menu['menuSlug'])) {
130 return;
131 }
132
133 // Hide locations if it shouldn't be shown based on license and hideUnavailableFeatures setting
134 if ($menu['menuSlug'] === 'wpamelia-locations' && !Licence::shouldShowFeature('locations')) {
135 return;
136 }
137
138 // Hide custom fields if it shouldn't be shown based on license and hideUnavailableFeatures setting
139 if ($menu['menuSlug'] === 'wpamelia-customfields' && !Licence::shouldShowFeature('customFields')) {
140 return;
141 }
142
143 // Add diamond icon for locked features
144 if ($menu['menuSlug'] === 'wpamelia-locations' && Licence::isFeatureLocked('locations')) {
145 $menu['menuTitle'] = '<span style="display: inline-flex; align-items: center;">'
146 . $menu['menuTitle'] . $this->getDiamondIcon() . '</span>';
147 }
148
149 if ($menu['menuSlug'] === 'wpamelia-customfields' && Licence::isFeatureLocked('customFields')) {
150 $menu['menuTitle'] = '<span style="display: inline-flex; align-items: center;">'
151 . $menu['menuTitle'] . $this->getDiamondIcon() . '</span>';
152 }
153
154 $this->addSubmenuPage(
155 $menu['parentSlug'],
156 $menu['pageTitle'],
157 $menu['menuTitle'],
158 $menu['capability'],
159 $menu['menuSlug'],
160 function () use ($menu) {
161 $this->submenuHandler->render($menu['menuSlug']);
162 }
163 );
164 }
165
166 /**
167 * @noinspection MoreThanThreeArgumentsInspection
168 *
169 * @param $parentSlug
170 * @param $pageTitle
171 * @param $menuTitle
172 * @param $capability
173 * @param $menuSlug
174 * @param string $function
175 */
176 private function addSubmenuPage($parentSlug, $pageTitle, $menuTitle, $capability, $menuSlug, $function = '')
177 {
178 add_submenu_page(
179 $parentSlug,
180 $pageTitle,
181 $menuTitle,
182 $capability,
183 $menuSlug,
184 $function
185 );
186 }
187 }
188