-
Notifications
You must be signed in to change notification settings - Fork 0
/
add_buttons.php
116 lines (99 loc) · 5.24 KB
/
add_buttons.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
<?php
/**
* Main plugin file to extend Roundcube's abstract plugin class.
*
* @see https://github.com/roundcube/roundcubemail/wiki/Plugin-API
* @license SPDX-License-Identifier: GPL-3.0-or-later
* @copyright SPDX-FileCopyrightText: foundata GmbH <https://foundata.com>
*/
/**
* Plugin class to extend different menus / navigation bars with additional buttons.
*/
class add_buttons extends rcube_plugin
{
function init()
{
// get plugin config
$this->load_config();
// load skin-specific stylesheets (if any)
$stylesheet_path = $this->local_skin_path() . '/add_buttons.css';
//if (file_exists($stylesheet_path)) {
$this->include_stylesheet($stylesheet_path);
//}
// switches to control if a shared resource has (not) to be included
$included_fontawesome_v5 = false;
$included_fontawesome_v6 = false;
foreach (rcube::get_instance()->config->get('add_buttons', array()) as $index => $button_item) {
// set defaults
if (empty($button_item['type'])) {
$button_item['type'] = 'link';
}
if (empty($button_item['container'])) {
$button_item['container'] = 'taskbar';
}
if (empty($button_item['onclick'])) {
$button_item['onclick'] = ''; // empty string will prevent adding the attribute
}
// check data
//
// Currently supported Roundcube containers: 'taskbar', 'toolbar', 'messagemenu'.
// You can search for '<roundcube:container name="' in a template to check if they are
// existing when adding support for new templates and add additional checks here if there
// are edge cases.
if (!in_array($button_item['type'], array('link')) ||
!in_array($button_item['container'], array('taskbar', 'toolbar', 'messagemenu'))) {
rcmail::log_bug('Invalid item in "add_buttons" config: Skipping buttom item '. $index);
continue;
}
// userdefined inline SVG icon
if (isset($button_item['icon_inline']) && $button_item['icon_inline'] !== '') {
// FIXME check for SVG or base64 image like string
$content = $button_item['icon_inline'];
/* FIXME To be implemented
// Heroicons v2 icon
} elseif (isset($button_item['icon_heroicons_v2']) && $button_item['icon_heroicons_v2'] !== '') {
// FIXME
} */
// Font Awesome v5 icon
// FIXME <i> element is disabled with mobile view
} elseif (isset($button_item['icon_fontawesome_v5']) && $button_item['icon_fontawesome_v5'] !== '') {
if ($included_fontawesome_v5 === false) {
// FIXME this is just a temporary resource during development / PoC. It has
// to be replaced with a local copy if we are sure to use FA this way.
$this->include_stylesheet('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css');
$included_fontawesome_v5 = true;
}
$content = '<i class="' . $button_item['icon_fontawesome_v5'] . '"></i>';
// Font Awesome v6 icon
// FIXME <i> element is disabled in mobile view
} elseif (isset($button_item['icon_fontawesome_v6']) && $button_item['icon_fontawesome_v6'] !== '') {
if ($included_fontawesome_v6 === false) {
// FIXME this is just a temporary resource during development / PoC. It has
// to be replaced with a local copy if we are sure to use FA this way.
$this->include_stylesheet('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css');
$included_fontawesome_v6 = true;
}
$content = '<i class="' . $button_item['icon_fontawesome_v6'] . '"></i>';
}
// Add label
$content .= '<span class="inner">' . htmlspecialchars($button_item['label'], ENT_NOQUOTES | ENT_SUBSTITUTE, 'UTF-8') . '</span>'; // FIXME research encoding function to be used. something like https://github.com/roundcube/roundcubemail/blob/master/program/lib/Roundcube/html.php#L390 for content? RCUBE_CHARSET instead of UTF-8?
// https://docs.roundcube.net/doc/phpdoc/classes/rcube_plugin.html#method_add_button
$this->add_button(
// parameters (as used in skin templates), parameters with empty string as
// value are getting ignored automatically.
array(
'type' => $button_item['type'],
'content' => $content,
'href' => $button_item['href'],
'target' => $button_item['target'],
'class' => 'add_buttons',
'classSel' => 'selected',
'innerclass' => '', // FIXME 'inner' for $button_item['label']
'onclick' => $button_item['onclick'],
),
// target container to add the button to
$button_item['container']
);
}
}
}