1<?php
2/*
3** Zabbix
4** Copyright (C) 2001-2021 Zabbix SIA
5**
6** This program is free software; you can redistribute it and/or modify
7** it under the terms of the GNU General Public License as published by
8** the Free Software Foundation; either version 2 of the License, or
9** (at your option) any later version.
10**
11** This program is distributed in the hope that it will be useful,
12** but WITHOUT ANY WARRANTY; without even the implied warranty of
13** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14** GNU General Public License for more details.
15**
16** You should have received a copy of the GNU General Public License
17** along with this program; if not, write to the Free Software
18** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19**/
20
21
22require_once dirname(__FILE__).'/events.inc.php';
23require_once dirname(__FILE__).'/actions.inc.php';
24require_once dirname(__FILE__).'/js.inc.php';
25
26function screen_resources($resource = null) {
27	$resources = [
28		SCREEN_RESOURCE_CLOCK => _('Clock'),
29		SCREEN_RESOURCE_DATA_OVERVIEW => _('Data overview'),
30		SCREEN_RESOURCE_GRAPH => _('Graph'),
31		SCREEN_RESOURCE_ACTIONS => _('Action log'),
32		SCREEN_RESOURCE_EVENTS => _('History of events'),
33		SCREEN_RESOURCE_HOSTS_INFO => _('Hosts info'),
34		SCREEN_RESOURCE_MAP => _('Map'),
35		SCREEN_RESOURCE_PLAIN_TEXT => _('Plain text'),
36		SCREEN_RESOURCE_SCREEN => _('Screen'),
37		SCREEN_RESOURCE_SERVER_INFO => _('Server info'),
38		SCREEN_RESOURCE_SIMPLE_GRAPH => _('Simple graph'),
39		SCREEN_RESOURCE_HOSTGROUP_TRIGGERS => _('Host group issues'),
40		SCREEN_RESOURCE_HOST_TRIGGERS => _('Host issues'),
41		SCREEN_RESOURCE_SYSTEM_STATUS => _('System status'),
42		SCREEN_RESOURCE_TRIGGERS_INFO => _('Triggers info'),
43		SCREEN_RESOURCE_TRIGGERS_OVERVIEW => _('Triggers overview'),
44		SCREEN_RESOURCE_URL => _('URL'),
45		SCREEN_RESOURCE_LLD_GRAPH => _('Graph prototype'),
46		SCREEN_RESOURCE_LLD_SIMPLE_GRAPH => _('Simple graph prototype')
47	];
48
49	if (is_null($resource)) {
50		natsort($resources);
51		return $resources;
52	}
53	elseif (isset($resources[$resource])) {
54		return $resources[$resource];
55	}
56	else {
57		return _('Unknown');
58	}
59}
60
61function check_screen_recursion($mother_screenid, $child_screenid) {
62	if (bccomp($mother_screenid , $child_screenid) == 0) {
63		return true;
64	}
65
66	$db_scr_items = DBselect(
67		'SELECT si.resourceid'.
68		' FROM screens_items si'.
69		' WHERE si.screenid='.zbx_dbstr($child_screenid).
70		' AND si.resourcetype='.SCREEN_RESOURCE_SCREEN
71	);
72	while ($scr_item = DBfetch($db_scr_items)) {
73		if (check_screen_recursion($mother_screenid, $scr_item['resourceid'])) {
74			return true;
75		}
76	}
77
78	return false;
79}
80
81/**
82 * Add screen row.
83 *
84 * @param array $screen
85 * @param int   $row_num
86 */
87function addScreenRow(array $screen, $row_num) {
88	foreach ($screen['screenitems'] as &$screen_item) {
89		if ($screen_item['y'] >= $row_num) {
90			$screen_item['y']++;
91		}
92	}
93	unset($screen_item);
94
95	DBstart();
96	$options = [
97		'screenid' => $screen['screenid'],
98		'vsize' => $screen['vsize'] + 1,
99		'screenitems' => $screen['screenitems']
100	];
101
102	$result = ($screen['templateid'] != 0)
103		? API::TemplateScreen()->update($options)
104		: API::Screen()->update($options);
105
106	if ($result) {
107		add_audit_details(AUDIT_ACTION_UPDATE, AUDIT_RESOURCE_SCREEN, $screen['screenid'], $screen['name'],
108			_('Row added')
109		);
110	}
111	DBend($result);
112}
113
114/**
115 * Add screen column.
116 *
117 * @param array $screen
118 * @param int   $col_num
119 */
120function addScreenColumn(array $screen, $col_num) {
121	foreach ($screen['screenitems'] as &$screen_item) {
122		if ($screen_item['x'] >= $col_num) {
123			$screen_item['x']++;
124		}
125	}
126	unset($screen_item);
127
128	DBstart();
129	$options = [
130		'screenid' => $screen['screenid'],
131		'hsize' => $screen['hsize'] + 1,
132		'screenitems' => $screen['screenitems']
133	];
134
135	$result = ($screen['templateid'] != 0)
136		? API::TemplateScreen()->update($options)
137		: API::Screen()->update($options);
138
139	if ($result) {
140		add_audit_details(AUDIT_ACTION_UPDATE, AUDIT_RESOURCE_SCREEN, $screen['screenid'], $screen['name'],
141			_('Column added')
142		);
143	}
144	DBend($result);
145}
146
147/**
148 * Remove screen row.
149 *
150 * @param array $screen
151 * @param int   $row_num
152 */
153function delScreenRow(array $screen, $row_num) {
154	foreach ($screen['screenitems'] as $key => &$screen_item) {
155		if ($screen_item['y'] == $row_num) {
156			unset($screen['screenitems'][$key]);
157		}
158		elseif ($screen_item['y'] > $row_num) {
159			$screen_item['y']--;
160		}
161	}
162	unset($screen_item);
163
164	DBstart();
165	$options = [
166		'screenid' => $screen['screenid'],
167		'vsize' => $screen['vsize'] - 1,
168		'screenitems' => $screen['screenitems']
169	];
170
171	$result = ($screen['templateid'] != 0)
172		? API::TemplateScreen()->update($options)
173		: API::Screen()->update($options);
174
175	if ($result) {
176		add_audit_details(AUDIT_ACTION_UPDATE, AUDIT_RESOURCE_SCREEN, $screen['screenid'], $screen['name'],
177			_('Row deleted')
178		);
179	}
180	DBend($result);
181}
182
183/**
184 * Remove screen column.
185 *
186 * @param array $screen
187 * @param int   $col_num
188 */
189function delScreenColumn(array $screen, $col_num) {
190	foreach ($screen['screenitems'] as $key => &$screen_item) {
191		if ($screen_item['x'] == $col_num) {
192			unset($screen['screenitems'][$key]);
193		}
194		elseif ($screen_item['x'] > $col_num) {
195			$screen_item['x']--;
196		}
197	}
198	unset($screen_item);
199
200	DBstart();
201	$options = [
202		'screenid' => $screen['screenid'],
203		'hsize' => $screen['hsize'] - 1,
204		'screenitems' => $screen['screenitems']
205	];
206
207	$result = ($screen['templateid'] != 0)
208		? API::TemplateScreen()->update($options)
209		: API::Screen()->update($options);
210
211	if ($result) {
212		add_audit_details(AUDIT_ACTION_UPDATE, AUDIT_RESOURCE_SCREEN, $screen['screenid'], $screen['name'],
213			_('Column deleted')
214		);
215	}
216	DBend($result);
217}
218
219function getSlideshowScreens($slideshowId, $step) {
220	$dbSlides = DBfetch(DBselect(
221		'SELECT MIN(s.step) AS min_step,MAX(s.step) AS max_step'.
222		' FROM slides s'.
223		' WHERE s.slideshowid='.zbx_dbstr($slideshowId)
224	));
225
226	if (!$dbSlides || $dbSlides['min_step'] === null) {
227		return false;
228	}
229
230	$step = $step % ($dbSlides['max_step'] + 1);
231
232	$currentStep = (!$step || $step < $dbSlides['min_step'] || $step > $dbSlides['max_step'])
233		? $dbSlides['min_step'] : $step;
234
235	return DBfetch(DBselect(
236		'SELECT sl.*'.
237		' FROM slides sl,slideshows ss'.
238		' WHERE ss.slideshowid='.zbx_dbstr($slideshowId).
239			' AND sl.slideshowid=ss.slideshowid'.
240			' AND sl.step='.zbx_dbstr($currentStep)
241	));
242}
243
244function slideshow_accessible($slideshowid, $perm) {
245	$result = false;
246
247	if (get_slideshow_by_slideshowid($slideshowid, PERM_READ)) {
248		$result = true;
249
250		$screenids = [];
251		$db_screens = DBselect(
252			'SELECT DISTINCT s.screenid'.
253			' FROM slides s'.
254			' WHERE s.slideshowid='.zbx_dbstr($slideshowid)
255		);
256		while ($slide_data = DBfetch($db_screens)) {
257			$screenids[$slide_data['screenid']] = $slide_data['screenid'];
258		}
259
260		$options = [
261			'output' => ['screenid'],
262			'screenids' => $screenids
263		];
264		if ($perm == PERM_READ_WRITE) {
265			$options['editable'] = true;
266		}
267		$screens = API::Screen()->get($options);
268		$screens = zbx_toHash($screens, 'screenid');
269
270		foreach ($screenids as $screenid) {
271			if (!isset($screens[$screenid])) {
272				return false;
273			}
274		}
275	}
276
277	return $result;
278}
279
280function get_slideshow_by_slideshowid($slideshowid, $permission) {
281	$user_data = CWebUser::$data;
282
283	$condition = '';
284	if ($user_data['type'] != USER_TYPE_SUPER_ADMIN && $user_data['type'] != USER_TYPE_ZABBIX_ADMIN) {
285		$public_slideshows = '';
286
287		if ($permission == PERM_READ) {
288			$public_slideshows = ' OR s.private='.PUBLIC_SHARING;
289		}
290
291		$user_groups = getUserGroupsByUserId($user_data['userid']);
292
293		$condition = ' AND (EXISTS ('.
294				'SELECT NULL'.
295				' FROM slideshow_user su'.
296				' WHERE s.slideshowid=su.slideshowid'.
297					' AND su.userid='.$user_data['userid'].
298					' AND su.permission>='.$permission.
299			')'.
300			' OR EXISTS ('.
301				'SELECT NULL'.
302				' FROM slideshow_usrgrp sg'.
303				' WHERE s.slideshowid=sg.slideshowid'.
304					' AND '.dbConditionInt('sg.usrgrpid', $user_groups).
305					' AND sg.permission>='.$permission.
306			')'.
307			' OR s.userid='.$user_data['userid'].
308			$public_slideshows.
309		')';
310	}
311
312	return DBfetch(DBselect(
313		'SELECT s.* FROM slideshows s WHERE s.slideshowid='.zbx_dbstr($slideshowid).$condition
314	));
315}
316
317function add_slideshow($data) {
318	$user_data = CWebUser::$data;
319
320	// Validate slides.
321	if (empty($data['slides'])) {
322		error(_('Slide show must contain slides.'));
323
324		return false;
325	}
326
327	// Validate screens.
328	$screenids = zbx_objectValues($data['slides'], 'screenid');
329
330	$screens = API::Screen()->get([
331		'output' => ['screenid'],
332		'screenids' => $screenids,
333		'preservekeys' => true
334	]);
335
336	foreach ($screenids as $screenid) {
337		if (!array_key_exists($screenid, $screens)) {
338			error(_('Incorrect screen provided for slide show.'));
339
340			return false;
341		}
342	}
343
344	// Validate slide name.
345	$db_slideshow = DBfetch(DBselect(
346		'SELECT s.slideshowid FROM slideshows s WHERE s.name='.zbx_dbstr($data['name'])
347	));
348
349	if ($db_slideshow) {
350		error(_s('Slide show "%s" already exists.', $data['name']));
351
352		return false;
353	}
354
355	// Validate slide show owner.
356	if ($data['userid'] === null) {
357		error(_('Slide show owner cannot be empty.'));
358
359		return false;
360	}
361	elseif ($data['userid'] != $user_data['userid'] && $user_data['type'] != USER_TYPE_SUPER_ADMIN
362			&& $user_data['type'] != USER_TYPE_ZABBIX_ADMIN) {
363		error(_('Only administrators can set slide show owner.'));
364
365		return false;
366	}
367
368	$slideshowid = get_dbid('slideshows', 'slideshowid');
369	$result = DBexecute(
370		'INSERT INTO slideshows (slideshowid,name,delay,userid,private)'.
371		' VALUES ('.zbx_dbstr($slideshowid).','.zbx_dbstr($data['name']).','.zbx_dbstr($data['delay']).','.
372			zbx_dbstr($data['userid']).','.zbx_dbstr($data['private']).')'
373	);
374
375
376	// User shares.
377	$shared_users = [];
378
379	foreach ($data['users'] as $user) {
380		if ($data['private'] == PUBLIC_SHARING && $user['permission'] == PERM_READ) {
381			error(_s('Slide show "%1$s" is public and read-only sharing is disallowed.', $data['name']));
382
383			return false;
384		}
385
386		$shared_users[] = [
387			'slideshowid' => $slideshowid,
388			'userid' => $user['userid'],
389			'permission' => $user['permission']
390		];
391	}
392
393	DB::insert('slideshow_user', $shared_users);
394
395	// User group shares.
396	$shared_user_groups = [];
397
398	foreach ($data['userGroups'] as $user_group) {
399		if ($data['private'] == PUBLIC_SHARING && $user_group['permission'] == PERM_READ) {
400			error(_s('Slide show "%1$s" is public and read-only sharing is disallowed.', $data['name']));
401
402			return false;
403		}
404
405		$shared_user_groups[] = [
406			'slideshowid' => $slideshowid,
407			'usrgrpid' => $user_group['usrgrpid'],
408			'permission' => $user_group['permission']
409		];
410	}
411
412	DB::insert('slideshow_usrgrp', $shared_user_groups);
413
414	// create slides
415	$i = 0;
416	foreach ($data['slides'] as $slide) {
417		$slideid = get_dbid('slides', 'slideid');
418
419		// set default delay
420		if (empty($slide['delay'])) {
421			$slide['delay'] = 0;
422		}
423
424		$result = DBexecute(
425			'INSERT INTO slides (slideid,slideshowid,screenid,step,delay)'.
426			' VALUES ('.zbx_dbstr($slideid).','.zbx_dbstr($slideshowid).','.zbx_dbstr($slide['screenid']).','.($i++).','.zbx_dbstr($slide['delay']).')'
427		);
428
429		if (!$result) {
430			return false;
431		}
432	}
433
434	return $slideshowid;
435}
436
437function update_slideshow($data) {
438	$user_data = CWebUser::$data;
439
440	// Validate slides.
441	if (empty($data['slides'])) {
442		error(_('Slide show must contain slides.'));
443
444		return false;
445	}
446
447	// validate screens.
448	$screenids = zbx_objectValues($data['slides'], 'screenid');
449
450	$screens = API::Screen()->get([
451		'output' => ['screenid'],
452		'screenids' => $screenids,
453		'preservekeys' => true
454	]);
455
456	foreach ($screenids as $screenid) {
457		if (!array_key_exists($screenid, $screens)) {
458			error(_('Incorrect screen provided for slide show.'));
459
460			return false;
461		}
462	}
463
464	// Validate slide name.
465	$db_slideshow = DBfetch(DBselect(
466		'SELECT s.slideshowid'.
467		' FROM slideshows s'.
468		' WHERE s.name='.zbx_dbstr($data['name']).
469			' AND s.slideshowid<>'.zbx_dbstr($data['slideshowid'])
470	));
471
472	if ($db_slideshow) {
473		error(_s('Slide show "%1$s" already exists.', $data['name']));
474
475		return false;
476	}
477
478	// Validate slide show owner.
479	if (array_key_exists('userid', $data)) {
480		if ($data['userid'] === null || $data['userid'] === '') {
481			error(_('Slide show owner cannot be empty.'));
482
483			return false;
484		}
485		elseif ($data['userid'] != $user_data['userid'] && $user_data['type'] != USER_TYPE_SUPER_ADMIN
486				&& $user_data['type'] != USER_TYPE_ZABBIX_ADMIN) {
487			error(_('Only administrators can set slide show owner.'));
488
489			return false;
490		}
491	}
492
493	$to_update = $data;
494	unset($to_update['slideshowid'], $to_update['slides'], $to_update['users'], $to_update['userGroups']);
495
496	DB::update('slideshows', [
497		'values' => $to_update,
498		'where' => ['slideshowid' => $data['slideshowid']]
499	]);
500
501	// Read-only sharing validation.
502	foreach ($data['users'] as $user) {
503		if ($data['private'] == PUBLIC_SHARING && $user['permission'] == PERM_READ) {
504			error(_s('Slide show "%1$s" is public and read-only sharing is disallowed.', $data['name']));
505
506			return false;
507		}
508	}
509
510	foreach ($data['userGroups'] as $user_group) {
511		if ($data['private'] == PUBLIC_SHARING && $user_group['permission'] == PERM_READ) {
512			error(_s('Slide show "%1$s" is public and read-only sharing is disallowed.', $data['name']));
513
514			return false;
515		}
516	}
517
518	$shared_userids_to_delete = [];
519	$shared_users_to_update = [];
520	$shared_users_to_add = [];
521	$shared_user_groupids_to_delete = [];
522	$shared_user_groups_to_update = [];
523	$shared_user_groups_to_add = [];
524
525	// Slide show user shares.
526	$db_slideshow['users'] = DBfetchArray(DBselect(
527		'SELECT s.userid,s.permission,s.slideshowuserid'.
528		' FROM slideshow_user s'.
529		' WHERE s.slideshowid='.zbx_dbstr(getRequest('slideshowid'))
530	));
531
532	$userids = [];
533	foreach ($db_slideshow['users'] as $user) {
534		$userids[] = $user['userid'];
535	}
536
537	$allowed_users = API::User()->get([
538		'output' => ['userid'],
539		'userids' => $userids,
540		'preservekeys' => true
541	]);
542
543	foreach ($db_slideshow['users'] as $key => $user) {
544		if (!array_key_exists($user['userid'], $allowed_users)) {
545			unset($db_slideshow['users'][$key]);
546		}
547	}
548
549	$user_shares_diff = zbx_array_diff($data['users'], $db_slideshow['users'], 'userid');
550
551	foreach ($user_shares_diff['both'] as $update_user_share) {
552		$shared_users_to_update[] = [
553			'values' => $update_user_share,
554			'where' => ['userid' => $update_user_share['userid'], 'slideshowid' => $data['slideshowid']]
555		];
556	}
557
558	foreach ($user_shares_diff['first'] as $new_shared_user) {
559		$new_shared_user['slideshowid'] = $data['slideshowid'];
560		$shared_users_to_add[] = $new_shared_user;
561	}
562
563	$shared_userids_to_delete = zbx_objectValues($user_shares_diff['second'], 'slideshowuserid');
564
565	// Slide show user group shares.
566	$db_slideshow['userGroups'] = DBfetchArray(DBselect(
567		'SELECT s.usrgrpid,s.permission,s.slideshowusrgrpid'.
568		' FROM slideshow_usrgrp s'.
569		' WHERE s.slideshowid='.zbx_dbstr(getRequest('slideshowid'))
570	));
571
572	$usrgrpids = [];
573	foreach ($db_slideshow['userGroups'] as $user_group) {
574		$usrgrpids[] = $user_group['usrgrpid'];
575	}
576
577	$allowed_user_groups = API::UserGroup()->get([
578		'output' => ['usrgrpid'],
579		'usrgrpids' => $usrgrpids,
580		'preservekeys' => true
581	]);
582
583	foreach ($db_slideshow['userGroups'] as $key => $user_group) {
584		if (!array_key_exists($user_group['usrgrpid'], $allowed_user_groups)) {
585			unset($db_slideshow['userGroups'][$key]);
586		}
587	}
588
589	$user_group_shares_diff = zbx_array_diff($data['userGroups'], $db_slideshow['userGroups'], 'usrgrpid');
590
591	foreach ($user_group_shares_diff['both'] as $update_user_share) {
592		$shared_user_groups_to_update[] = [
593			'values' => $update_user_share,
594			'where' => ['usrgrpid' => $update_user_share['usrgrpid'], 'slideshowid' => $data['slideshowid']]
595		];
596	}
597
598	foreach ($user_group_shares_diff['first'] as $new_shared_user_group) {
599		$new_shared_user_group['slideshowid'] = $data['slideshowid'];
600		$shared_user_groups_to_add[] = $new_shared_user_group;
601	}
602
603	$shared_user_groupids_to_delete = zbx_objectValues($user_group_shares_diff['second'], 'slideshowusrgrpid');
604
605	// User shares.
606	DB::insert('slideshow_user', $shared_users_to_add);
607	DB::update('slideshow_user', $shared_users_to_update);
608
609	if ($shared_userids_to_delete) {
610		DB::delete('slideshow_user', ['slideshowuserid' => $shared_userids_to_delete]);
611	}
612
613	// User group shares.
614	DB::insert('slideshow_usrgrp', $shared_user_groups_to_add);
615	DB::update('slideshow_usrgrp', $shared_user_groups_to_update);
616
617	if ($shared_user_groupids_to_delete) {
618		DB::delete('slideshow_usrgrp', ['slideshowusrgrpid' => $shared_user_groupids_to_delete]);
619	}
620
621	// get slides
622	$db_slides = DBfetchArrayAssoc(DBselect('SELECT s.* FROM slides s WHERE s.slideshowid='.zbx_dbstr($data['slideshowid'])), 'slideid');
623
624	$slidesToDel = zbx_objectValues($db_slides, 'slideid');
625	$slidesToDel = zbx_toHash($slidesToDel);
626	$step = 0;
627	foreach ($data['slides'] as $slide) {
628		$slide['delay'] = $slide['delay'] ? $slide['delay'] : 0;
629		if (isset($db_slides[$slide['slideid']])) {
630			// update slide
631			if ($db_slides[$slide['slideid']]['delay'] != $slide['delay'] || $db_slides[$slide['slideid']]['step'] != $step) {
632				$result = DBexecute('UPDATE slides SET step='.zbx_dbstr($step).', delay='.zbx_dbstr($slide['delay']).' WHERE slideid='.zbx_dbstr($slide['slideid']));
633			}
634			// do nothing with slide
635			else {
636				$result = true;
637			}
638			unset($slidesToDel[$slide['slideid']]);
639		}
640		// insert slide
641		else {
642			$slideid = get_dbid('slides', 'slideid');
643			$result = DBexecute(
644				'INSERT INTO slides (slideid,slideshowid,screenid,step,delay)'.
645				' VALUES ('.zbx_dbstr($slideid).','.zbx_dbstr($data['slideshowid']).','.zbx_dbstr($slide['screenid']).','.zbx_dbstr($step).','.zbx_dbstr($slide['delay']).')'
646			);
647		}
648		$step ++;
649		if (!$result) {
650			return false;
651		}
652	}
653
654	// delete unnecessary slides
655	if (!empty($slidesToDel)) {
656		DBexecute('DELETE FROM slides WHERE slideid IN('.implode(',', $slidesToDel).')');
657	}
658
659	return true;
660}
661
662function delete_slideshow($slideshowid) {
663	$result = false;
664
665	if (get_slideshow_by_slideshowid($slideshowid, PERM_READ_WRITE)) {
666		$result = DBexecute('DELETE FROM slideshows where slideshowid='.zbx_dbstr($slideshowid));
667		$result &= DBexecute('DELETE FROM slides where slideshowid='.zbx_dbstr($slideshowid));
668		$result &= DBexecute('DELETE FROM profiles WHERE idx=\'web.favorite.screenids\' AND source=\'slideshowid\' AND value_id='.zbx_dbstr($slideshowid));
669	}
670
671	return (bool) $result;
672}
673
674// check whether there are dynamic items in the screen, if so return TRUE, else FALSE
675function check_dynamic_items($elid, $config = 0) {
676	if ($config == 0) {
677		$sql = 'SELECT si.screenitemid'.
678				' FROM screens_items si'.
679				' WHERE si.screenid='.zbx_dbstr($elid).
680					' AND si.dynamic='.SCREEN_DYNAMIC_ITEM;
681	}
682	else {
683		$sql = 'SELECT si.screenitemid'.
684				' FROM slides s,screens_items si'.
685				' WHERE s.slideshowid='.zbx_dbstr($elid).
686					' AND si.screenid=s.screenid'.
687					' AND si.dynamic='.SCREEN_DYNAMIC_ITEM;
688	}
689	if (DBfetch(DBselect($sql, 1))) {
690		return true;
691	}
692
693	return false;
694}
695
696function getResourceNameByType($resourceType) {
697	switch ($resourceType) {
698		case SCREEN_RESOURCE_DATA_OVERVIEW:
699		case SCREEN_RESOURCE_TRIGGERS_OVERVIEW:
700			return _('Group');
701	}
702
703	return null;
704}
705