-
Notifications
You must be signed in to change notification settings - Fork 7
/
recentmenu.php
134 lines (125 loc) · 3.67 KB
/
recentmenu.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
<?php
require_once 'recentmenu.civix.php';
use CRM_Recentmenu_ExtensionUtil as E;
/**
* Implements hook_civicrm_config().
*
* @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_config
*/
function recentmenu_civicrm_config(&$config) {
_recentmenu_civix_civicrm_config($config);
}
/**
* Implements hook_civicrm_install().
*
* @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_install
*/
function recentmenu_civicrm_install() {
_recentmenu_civix_civicrm_install();
}
/**
* Implements hook_civicrm_enable().
*
* @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_enable
*/
function recentmenu_civicrm_enable() {
_recentmenu_civix_civicrm_enable();
}
/**
* Implements hook_civicrm_pageRun().
*/
function recentmenu_civicrm_pageRun(&$page) {
if (!empty($_REQUEST['snippet']) && in_array($_REQUEST['snippet'], ['json', 6])) {
$page->ajaxResponse['recentmenu_items'] = _get_recentmenu_items();
}
}
/**
* Implements hook_civicrm_preProcess().
*/
function recentmenu_civicrm_preProcess($formName, &$form) {
if (!empty($_REQUEST['snippet']) && in_array($_REQUEST['snippet'], ['json', 6])) {
$form->ajaxResponse['recentmenu_items'] = _get_recentmenu_items();
}
}
/**
* Implements hook_civicrm_postProcess().
*/
function recentmenu_civicrm_postProcess($formName, &$form) {
if (!empty($_REQUEST['snippet']) && in_array($_REQUEST['snippet'], ['json', 6])) {
$form->ajaxResponse['recentmenu_items'] = _get_recentmenu_items();
}
}
/**
* Implements hook_civicrm_coreResourceList().
*/
function recentmenu_civicrm_coreResourceList(&$list, $region) {
if ($region == 'html-header') {
$recentMenuItems = _get_recentmenu_items();
if ($recentMenuItems) {
Civi::resources()
->addScriptFile('org.civicrm.recentmenu', 'js/recentmenu.js', 0, 'html-header')
->addVars('recentmenu', $recentMenuItems);
}
}
}
/**
* @return array|NULL
*/
function _get_recentmenu_items() {
if (!CRM_Core_Permission::check('access CiviCRM')) {
return NULL;
}
// Lookup existing menu item to get the possibly user-defined label and icon
$navigation = \Civi\Api4\Navigation::get(FALSE)
->addWhere('name', '=', 'recent_items')
->addSelect('label', 'icon')
->addWhere('domain_id', '=', 'current_domain')
->execute()->first();
if (!$navigation) {
// Maybe the managed navigation entity hasn't been reconciled yet, e.g. mid-upgrade
return NULL;
}
try {
$recent = \Civi\Api4\RecentItem::get()->execute();
}
catch (Exception $e) {
// No logged-in user?
return NULL;
}
$menu = [
'label' => $navigation['label'] . ' (' . $recent->count() . ')',
'name' => 'recent_items',
'icon' => $navigation['icon'],
'child' => [],
];
$entityTitles = \Civi\Api4\Entity::get(FALSE)
->addSelect('name', 'title')
->execute()
->indexBy('name')->column('title');
foreach ($recent as $i => $item) {
$entityTitle = $entityTitles[$item['entity_type']] ?? '';
$node = [
'label' => $item['title'],
'url' => $item['view_url'],
'name' => 'recent_items_' . $i,
'attr' => ['title' => E::ts('View %1', [1 => $entityTitle])],
'icon' => 'crm-i fa-fw ' . ($item['icon'] ?? 'fa-gear'),
'child' => [
[
'label' => E::ts('View %1', [1 => $entityTitle]),
'url' => $item['view_url'],
'name' => 'recent_items_' . $i . '_view',
],
],
];
if (!empty($item['edit_url'])) {
$node['child'][] = [
'label' => E::ts('Edit %1', [1 => $entityTitle]),
'url' => $item['edit_url'],
'name' => 'recent_items_' . $i . '_edit',
];
}
$menu['child'][] = $node;
}
return $menu;
}