PluginProbe
Fluent Support – Helpdesk & Customer Support Ticket System / 1.5.3
Fluent Support – Helpdesk & Customer Support Ticket System v1.5.3
2.4.0 2.3.2 2.3.1 2.3.0 2.2.1 2.2.0 trunk 1.10.0 1.10.1 1.10.2 1.10.3 1.10.4 1.10.5 1.4.0 1.4.1 1.4.2 1.4.5 1.4.6 1.4.7 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 All 68 releases
fluent-support / app / Hooks / Handlers / Menu.php

Menu.php in Fluent Support – Helpdesk & Customer Support Ticket System 1.5.3, at app/Hooks/Handlers/Menu.php

366 lines 13.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace FluentSupport\App\Hooks\Handlers;
4
5 use FluentSupport\App\App;
6 use FluentSupport\App\Models\Agent;
7 use FluentSupport\App\Models\MailBox;
8 use FluentSupport\App\Models\Product;
9 use FluentSupport\App\Models\TicketTag;
10 use FluentSupport\App\Modules\PermissionManager;
11 use FluentSupport\App\Services\Helper;
12 use FluentSupport\App\Services\TransStrings;
13
14 class Menu
15 {
16 public function add()
17 {
18 $currentUserPermissions = PermissionManager::currentUserPermissions();
19
20 if (!$currentUserPermissions) {
21 return;
22 }
23
24 $permission = 'fst_view_dashboard';
25
26 $isAdmin = false;
27
28 if (current_user_can('manage_options')) {
29 $permission = 'manage_options';
30 $isAdmin = true;
31 }
32
33 $menuPosition = 25;
34 if (defined('FLUENTCRM')) {
35 $menuPosition = 4;
36 }
37
38 $menuPosition = apply_filters('fluent_support/admin_menu_position', $menuPosition);
39
40 add_menu_page(
41 __('Fluent Support', 'fluent-support'),
42 __('Fluent Support', 'fluent-support'),
43 $permission,
44 'fluent-support',
45 array($this, 'renderApp'),
46 $this->getMenuIcon(),
47 $menuPosition
48 );
49
50
51 add_submenu_page(
52 'fluent-support',
53 __('Dashboard', 'fluent-support'),
54 __('Dashboard', 'fluent-support'),
55 $permission,
56 'fluent-support',
57 array($this, 'renderApp')
58 );
59
60 add_submenu_page(
61 'fluent-support',
62 __('Tickets', 'fluent-support'),
63 __('Tickets', 'fluent-support'),
64 ($isAdmin) ? 'manage_options' : 'fst_manage_own_tickets',
65 'fluent-support#/tickets',
66 array($this, 'renderApp')
67 );
68
69 add_submenu_page(
70 'fluent-support',
71 __('Workflows', 'fluent-support'),
72 __('Workflows', 'fluent-support'),
73 ($isAdmin) ? 'manage_options' : 'fst_manage_workflows',
74 'fluent-support#/workflows',
75 array($this, 'renderApp')
76 );
77
78 add_submenu_page(
79 'fluent-support',
80 __('Activities', 'fluent-support'),
81 __('Activities', 'fluent-support'),
82 ($isAdmin) ? 'manage_options' : 'fst_view_activity_logs',
83 'fluent-support#/activity-logger',
84 array($this, 'renderApp')
85 );
86
87 add_submenu_page(
88 'fluent-support',
89 __('Settings', 'fluent-support'),
90 __('Settings', 'fluent-support'),
91 ($isAdmin) ? 'manage_options' : 'fst_manage_settings',
92 'fluent-support#/settings',
93 array($this, 'renderApp')
94 );
95
96 add_submenu_page(
97 'fluent-support',
98 __('Reports', 'fluent-support'),
99 __('Reports', 'fluent-support'),
100 ($isAdmin) ? 'manage_options' : 'fst_sensitive_data',
101 'fluent-support#/reports',
102 array($this, 'renderApp')
103 );
104
105 }
106
107 public function renderApp()
108 {
109 $app = App::getInstance();
110
111 $assets = $app['url.assets'];
112
113 $baseUrl = apply_filters('fluent_support/base_url', admin_url('admin.php?page=fluent-support#/'));
114
115 $menuItems = [
116 [
117 'key' => 'dashboard',
118 'label' => __('Dashboard', 'fluent-support'),
119 'permalink' => $baseUrl
120 ],
121 [
122 'key' => 'tickets',
123 'label' => __('Tickets', 'fluent-support'),
124 'permalink' => $baseUrl . 'tickets',
125 ],
126 [
127 'key' => 'reports',
128 'label' => __('Reports', 'fluent-support'),
129 'permalink' => $baseUrl . 'reports'
130 ]
131 ];
132
133 $hasSensitiveAccess = PermissionManager::currentUserCan('fst_sensitive_data');
134 if ($hasSensitiveAccess) {
135 $menuItems[] = [
136 'key' => 'customers',
137 'label' => __('Customers', 'fluent-support'),
138 'permalink' => $baseUrl . 'customers'
139 ];
140 }
141
142 if (PermissionManager::currentUserCan('fst_manage_saved_replies')) {
143 $secondayItems = [
144 [
145 'key' => 'saved_replies',
146 'label' => __('Saved Replies', 'fluent-support'),
147 'permalink' => $baseUrl . 'saved-replies'
148 ]
149 ];
150 }
151
152 if (PermissionManager::currentUserCan('fst_view_activity_logs')) {
153 $secondayItems[] = [
154 'key' => 'activity_logger',
155 'label' => __('Activities', 'fluent-support'),
156 'permalink' => $baseUrl . 'activity-logger'
157 ];
158 }
159
160 $canManageSettings = PermissionManager::currentUserCan('fst_manage_settings');
161
162 if ($canManageSettings) {
163 $secondayItems[] = [
164 'key' => 'mailboxes',
165 'label' => __('Business Inboxes', 'fluent-support'),
166 'permalink' => $baseUrl . 'mailboxes'
167 ];
168 }
169
170 if (PermissionManager::currentUserCan('fst_manage_workflows')) {
171 $secondayItems[] = [
172 'key' => 'workflows',
173 'label' => __('Workflows', 'fluent-support'),
174 'permalink' => $baseUrl . 'workflows'
175 ];
176 }
177
178 if ($canManageSettings) {
179 $secondayItems[] = [
180 'key' => 'settings',
181 'label' => __('Global Settings', 'fluent-support'),
182 'permalink' => $baseUrl . 'settings'
183 ];
184 }
185
186
187 $menuItems = apply_filters('fluent_support/primary_menu_items', $menuItems);
188 $secondayItems = apply_filters('fluent_support/secondary_menu_items', $secondayItems);
189
190
191 if(!defined('FLUENT_SUPPORT_PRO_DIR_FILE')) {
192 $secondayItems[] = [
193 'key' => 'upgrade_to_pro',
194 'label' => 'Upgrade to Pro',
195 'permalink' => 'https://fluentsupport.com'
196 ];
197 }
198
199 $app = App::getInstance();
200 $this->enqueueAssets();
201 $app->view->render('admin.menu', [
202 'base_url' => $baseUrl,
203 'logo' => $assets . 'images/logo.svg',
204 'menuItems' => $menuItems,
205 'secondaryItems' => $secondayItems
206 ]);
207 }
208
209 public function maybeEnqueueAssets()
210 {
211 if (isset($_GET['page']) && $_GET['page'] == 'fluent-support') {
212 $this->enqueueAssets();
213 }
214 }
215
216 public function enqueueAssets()
217 {
218 $app = App::getInstance();
219
220 $assets = $app['url.assets'];
221
222 wp_enqueue_style(
223 'fluent_support_admin_app', $assets . 'admin/css/alpha-admin.css', [], FLUENT_SUPPORT_VERSION
224 );
225
226 $agents = Agent::select(['id', 'first_name', 'last_name'])
227 ->where('person_type', 'agent')
228 ->get()->toArray();
229
230 foreach ($agents as $index => $agent) {
231 $agents[$index]['id'] = strval($agent['id']);
232 }
233
234 $me = Helper::getAgentByUserId(get_current_user_id());
235
236 if (!$me && current_user_can('manage_options')) {
237 // we should create the agent
238 $user = wp_get_current_user();
239 $me = Agent::create([
240 'email' => $user->user_email,
241 'first_name' => $user->first_name,
242 'last_name' => $user->last_name,
243 'user_id' => $user->ID
244 ]);
245 }
246
247 $me->permissions = PermissionManager::currentUserPermissions();
248
249 do_action('fluent_support_loading_app', $app);
250
251 // Editor default styles.
252 add_filter('user_can_richedit', '__return_true');
253 wp_tinymce_inline_scripts();
254 wp_enqueue_editor();
255 wp_enqueue_media();
256
257 wp_enqueue_script(
258 'fluent_support_admin_app_start',
259 $assets . 'admin/js/start.js',
260 array('jquery'),
261 FLUENT_SUPPORT_VERSION,
262 true
263 );
264
265 wp_enqueue_script(
266 'fluent_support_global_admin',
267 $assets . 'admin/js/global_admin.js',
268 array('jquery'),
269 FLUENT_SUPPORT_VERSION,
270 true
271 );
272
273 $integrationDrivers = [];
274 if (!defined('FLUENTSUPPORTPRO')) {
275 $integrationDrivers = [
276 [
277 'key' => 'telegram_settings',
278 'title' => __('Telegram', 'fluent-support'),
279 'description' => __('Send Telegram notifications to Group, Channel or individual person inbox and reply from Telegram inbox', 'fluent-support'),
280 'promo_heading' => __('Get activity notification to Telegram Messenger and reply directly from Telegram inbox', 'fluent-support'),
281 'require_pro' => true
282 ],
283 [
284 'key' => 'slack_settings',
285 'title' => __('Slack', 'fluent-support'),
286 'description' => __('Send ticket activity notifications to slack', 'fluent-support'),
287 'promo_heading' => __('Get activity notification to Slack Channel and keep your support team super engaged', 'fluent-support'),
288 'require_pro' => true
289 ]
290 ];
291 }
292
293 $integrationDrivers = apply_filters('fluent_support/integration_drivers', $integrationDrivers);
294
295 $tags = TicketTag::select(['id', 'title'])->get()->toArray();
296
297 $tags = array_map(function ($tag) {
298 $tag['id'] = strval($tag['id']);
299 return $tag;
300 }, $tags);
301
302 $i18ns = TransStrings::getTransStrings();
303 $i18ns['allowed_files_and_size'] = Helper::getFileUploadMessage();
304
305 $appVars = apply_filters('fluent_support_app_vars', array(
306 'slug' => $slug = $app->config->get('app.slug'),
307 'nonce' => wp_create_nonce($slug),
308 'rest' => $this->getRestInfo($app),
309 'brand_logo' => $this->getMenuIcon(),
310 'firstEntry' => '',
311 'lastEntry' => '',
312 'asset_url' => $assets,
313 'support_agents' => $agents,
314 'support_products' => Product::select(['id', 'title'])->get(),
315 'client_priorities' => Helper::customerTicketPriorities(),
316 'admin_priorities' => Helper::adminTicketPriorities(),
317 'mailboxes' => MailBox::select(['id', 'name', 'settings'])->get(),
318 'me' => $me,
319 'pref' => [
320 'go_back_after_reply' => 'yes'
321 ],
322 'notification_integrations' => $integrationDrivers,
323 'server_time' => current_time('mysql'),
324 'has_email_parser' => defined('FLUENTSUPPORTPRO_PLUGIN_VERSION'),
325 'ticket_tags' => $tags,
326 'i18n' => $i18ns,
327 'custom_fields' => apply_filters('fluent_support/ticket_custom_fields', []),
328 'has_file_upload' => !!Helper::ticketAcceptedFileMiles()
329 ));
330
331 if(defined('FLUENTCRM')) {
332 $appVars['fluentcrm_config'] = Helper::getFluentCRMTagConfig();
333 }
334
335 $appVars['has_pro'] = defined('FLUENTSUPPORTPRO_PLUGIN_VERSION');
336 wp_localize_script('fluent_support_admin_app_start', 'fluentSupportAdmin', $appVars);
337 do_action('fluent_support/admin_app_loaded', $app);
338
339 }
340
341 protected function getRestInfo($app)
342 {
343 $ns = $app->config->get('app.rest_namespace');
344 $v = $app->config->get('app.rest_version');
345
346 return [
347 'base_url' => esc_url_raw(rest_url()),
348 'url' => rest_url($ns . '/' . $v),
349 'nonce' => wp_create_nonce('wp_rest'),
350 'namespace' => $ns,
351 'version' => $v,
352 ];
353 }
354
355 protected function getMenuIcon()
356 {
357 $app = App::getInstance();
358
359 $assets = $app['path.assets'];
360
361 return 'data:image/svg+xml;base64,' . base64_encode(
362 '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 1200"><defs><style>.cls-1{fill:#fff;fill-rule:evenodd;}</style></defs><path class="cls-1" d="M1154.68,162.74v328l-.06-.05c-28.42-68.67-94.1-118-171.88-122.75a193.27,193.27,0,0,0-64.45,6.17L137.57,583.44A70.3,70.3,0,0,1,122.08,586a62.79,62.79,0,0,1-10.77.94A66.34,66.34,0,0,1,45,521.43a73.54,73.54,0,0,1-.61-9.28v-111c0-.16,0-.33,0-.5s0-.27,0-.39c0-1.27.16-2.49.22-3.77s.05-2.39.17-3.55c.16-2.06.44-4.06.72-6.06.11-.55.16-1.16.27-1.72.34-1.94.73-3.83,1.23-5.71.16-.84.33-1.56.55-2.34.45-1.55.89-3.05,1.33-4.55s1.06-3,1.61-4.55c.28-.61.5-1.28.78-1.94a92.91,92.91,0,0,1,62.12-54.85L1028.49,66.08a100.17,100.17,0,0,1,18.82-3.44,94.46,94.46,0,0,1,14.21-1.89c1.39,0,2.72-.11,4.11-.11a88.59,88.59,0,0,1,88.55,88.61c0,.55-.06,1.16-.06,1.77A102.6,102.6,0,0,1,1154.68,162.74Z"/><path class="cls-1" d="M943.32,498.86c-2.07,0-4.08.05-6.09.15-2.12-.1-4.29-.15-6.46-.15a139.56,139.56,0,0,0-35.94,4.71l-121.22,32.5L118.06,711.86A86,86,0,0,0,89.43,722c-.38.16-.69.37-1,.53a88.53,88.53,0,0,0-44,76.59v335.42a3.68,3.68,0,0,0,6.93,1.76,400,400,0,0,1,128.84-142,1.75,1.75,0,0,1,.32-.21A321.92,321.92,0,0,1,257.12,954a.22.22,0,0,1,.11,0q12.61-4.61,25.72-8.1l46.43-12.44,626.16-167.8,13-3.5a121.56,121.56,0,0,0,18.58-5,132.87,132.87,0,0,0-43.77-258.32Z"/></svg>'
363 );
364 }
365 }
366