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__).'/js/monitoring.screen.edit.js.php';
23
24$widget = (new CWidget())->setTitle(_('Screens'));
25
26$tabs = new CTabView();
27
28if (!$data['form_refresh']) {
29	$tabs->setSelected(0);
30}
31
32if ($data['screen']['templateid']) {
33	$widget->addItem(get_header_host_table('screens', $data['screen']['templateid']));
34}
35
36// create form
37$form = (new CForm())
38	->setName('screenForm')
39	->addVar('form', $data['form']);
40
41if ($data['screen']['templateid'] != 0) {
42	$form->addVar('templateid', $data['screen']['templateid']);
43}
44else {
45	$form->addVar('current_user_userid', $data['current_user_userid'])
46		->addVar('current_user_fullname', getUserFullname($data['users'][$data['current_user_userid']]));
47}
48
49if ($data['screen']['screenid']) {
50	$form->addVar('screenid', $data['screen']['screenid']);
51}
52
53$user_type = CWebUser::getType();
54
55// Create screen form list.
56$screen_tab = (new CFormList());
57
58if (!$data['screen']['templateid']) {
59	// Screen owner multiselect.
60	$multiselect_data = [
61		'name' => 'userid',
62		'selectedLimit' => 1,
63		'objectName' => 'users',
64		'disabled' => ($user_type != USER_TYPE_SUPER_ADMIN && $user_type != USER_TYPE_ZABBIX_ADMIN),
65		'popup' => [
66			'parameters' => 'srctbl=users&dstfrm='.$form->getName().'&dstfld1=userid&srcfld1=userid&srcfld2=fullname'
67		]
68	];
69
70	$screen_ownerid = $data['screen']['userid'];
71
72	// If screen owner does not exist or is not allowed to display.
73	if ($screen_ownerid === '' || $screen_ownerid && array_key_exists($screen_ownerid, $data['users'])) {
74		// Screen owner data.
75		if ($screen_ownerid) {
76			$owner_data = [[
77				'id' => $screen_ownerid,
78				'name' => getUserFullname($data['users'][$screen_ownerid])
79			]];
80		}
81		else {
82			$owner_data = [];
83		}
84
85		$multiselect_data['data'] = $owner_data;
86
87		// Append multiselect to screen tab.
88		$screen_tab->addRow(_('Owner'),
89			(new CMultiSelect($multiselect_data))->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
90		);
91	}
92	else {
93		$multiselect_userid = (new CMultiSelect($multiselect_data))->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH);
94
95		// Administrators can change screen owner, but cannot see users from other groups.
96		if ($user_type == USER_TYPE_ZABBIX_ADMIN) {
97			$screen_tab->addRow(_('Owner'), $multiselect_userid)
98				->addRow('', _('Inaccessible user'), 'inaccessible_user');
99		}
100		else {
101			// For regular users and guests, only information message is displayed without multiselect.
102			$screen_tab->addRow(_('Owner'), [
103				(new CSpan(_('Inaccessible user')))->setId('inaccessible_user'),
104				(new CSpan($multiselect_userid))
105					->addStyle('display: none;')
106					->setId('multiselect_userid_wrapper')
107			]);
108		}
109	}
110}
111
112$screen_tab->addRow(_('Name'),
113		(new CTextBox('name', $data['screen']['name']))
114		->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
115		->setAttribute('autofocus', 'autofocus')
116	)
117	->addRow(_('Columns'),
118		(new CNumericBox('hsize', $data['screen']['hsize'], 3))->setWidth(ZBX_TEXTAREA_NUMERIC_STANDARD_WIDTH)
119	)
120	->addRow(_('Rows'),
121		(new CNumericBox('vsize', $data['screen']['vsize'], 3))->setWidth(ZBX_TEXTAREA_NUMERIC_STANDARD_WIDTH)
122	);
123
124// append tab to form
125$tabs->addTab('screen_tab', _('Screen'), $screen_tab);
126if (!$data['screen']['templateid']) {
127	// User group sharing table.
128	$user_group_shares_table = (new CTable())
129		->setHeader([_('User groups'), _('Permissions'), _('Action')])
130		->setAttribute('style', 'width: 100%;');
131
132	$add_user_group_btn = ([(new CButton(null, _('Add')))
133		->onClick('return PopUp("popup.php?dstfrm='.$form->getName().
134			'&srctbl=usrgrp&srcfld1=usrgrpid&srcfld2=name&multiselect=1")'
135		)
136		->addClass(ZBX_STYLE_BTN_LINK)]);
137
138	$user_group_shares_table->addRow(
139		(new CRow(
140			(new CCol($add_user_group_btn))->setColSpan(3)
141		))->setId('user_group_list_footer')
142	);
143
144	$user_groups = [];
145
146	foreach ($data['screen']['userGroups'] as $user_group) {
147		$user_groupid = $user_group['usrgrpid'];
148		$user_groups[$user_groupid] = [
149			'usrgrpid' => $user_groupid,
150			'name' => $data['user_groups'][$user_groupid]['name'],
151			'permission' => $user_group['permission']
152		];
153	}
154
155	$js_insert = 'addPopupValues('.zbx_jsvalue(['object' => 'usrgrpid', 'values' => $user_groups]).');';
156
157	// User sharing table.
158	$user_shares_table = (new CTable())
159		->setHeader([_('Users'), _('Permissions'), _('Action')])
160		->setAttribute('style', 'width: 100%;');
161
162	$add_user_btn = ([(new CButton(null, _('Add')))
163		->onClick('return PopUp("popup.php?dstfrm='.$form->getName().
164			'&srctbl=users&srcfld1=userid&srcfld2=fullname&multiselect=1")'
165		)
166		->addClass(ZBX_STYLE_BTN_LINK)]);
167
168	$user_shares_table->addRow(
169		(new CRow(
170			(new CCol($add_user_btn))->setColSpan(3)
171		))->setId('user_list_footer')
172	);
173
174	$users = [];
175
176	foreach ($data['screen']['users'] as $user) {
177		$userid = $user['userid'];
178		$users[$userid] = [
179			'id' => $userid,
180			'name' => getUserFullname($data['users'][$userid]),
181			'permission' => $user['permission']
182		];
183	}
184
185	$js_insert .= 'addPopupValues('.zbx_jsvalue(['object' => 'userid', 'values' => $users]).');';
186
187	zbx_add_post_js($js_insert);
188
189	$sharing_tab = (new CFormList('sharing_form'))
190		->addRow(_('Type'),
191		(new CRadioButtonList('private', (int) $data['screen']['private']))
192			->addValue(_('Private'), PRIVATE_SHARING)
193			->addValue(_('Public'), PUBLIC_SHARING)
194			->setModern(true)
195		)
196		->addRow(_('List of user group shares'),
197			(new CDiv($user_group_shares_table))
198				->addClass(ZBX_STYLE_TABLE_FORMS_SEPARATOR)
199				->setAttribute('style', 'min-width: '.ZBX_TEXTAREA_STANDARD_WIDTH.'px;')
200		)
201		->addRow(_('List of user shares'),
202			(new CDiv($user_shares_table))
203				->addClass(ZBX_STYLE_TABLE_FORMS_SEPARATOR)
204				->setAttribute('style', 'min-width: '.ZBX_TEXTAREA_STANDARD_WIDTH.'px;')
205		);
206
207	// Append data to form.
208	$tabs->addTab('sharing_tab', _('Sharing'), $sharing_tab);
209}
210
211// append buttons to form
212if ($data['screen']['screenid']) {
213	$tabs->setFooter(makeFormFooter(
214		new CSubmit('update', _('Update')),
215		[
216			(new CSimpleButton(_('Clone')))->setId('clone'),
217			new CButtonDelete(_('Delete screen?'), url_params(['form', 'screenid', 'templateid'])),
218			new CButtonCancel(url_param('templateid'))
219		]
220	));
221}
222else {
223	$tabs->setFooter(makeFormFooter(
224		new CSubmit('add', _('Add')),
225		[new CButtonCancel(url_param('templateid'))]
226	));
227}
228
229$form->addItem($tabs);
230
231$widget->addItem($form);
232
233return $widget;
234