1<?php
2// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
3//
4// All Rights Reserved. See copyright.txt for details and a complete list of authors.
5// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
6// $Id$
7
8/* {user_selector
9 *     user = $user
10 *     select = 'user_tobe_selected'
11 *     group = 'all'
12 *     groupIds = ''
13 *     name = 'user'
14 *     id = user_selector_XX
15 *     size = ''
16 *     contact = 'false'
17 *     multiple = 'false'
18 *     editable = $tiki_p_admin
19 * 	   allowNone = 'n'
20 *     realnames = 'y'
21 *  }
22 *
23 * Display a drop down menu of all users or
24 * an input box with autocomplete if there are more users
25 * than $prefs['user_selector_threshold']
26 */
27function smarty_function_user_selector($params, $smarty)
28{
29	global $prefs, $user, $tiki_p_admin;
30	$tikilib = TikiLib::lib('tiki');
31	$headerlib = TikiLib::lib('header');
32	$userlib = TikiLib::lib('user');
33	$smarty->loadPlugin('smarty_modifier_username');
34
35	static $iUserSelector = 0;
36	$iUserSelector++;
37
38	$defaults = [
39			'user' => $user,
40			'group' => 'all',
41			'groupIds' => '',
42			'contact' => 'false',
43			'name' => 'user',
44			'id' => 'user_selector_' . $iUserSelector,
45			'multiple' => 'false',
46			'mustmatch' => 'true',
47			'style' => '' ,
48			'editable' => $tiki_p_admin,
49			'user_selector_threshold' => $prefs['user_selector_threshold'],
50			'allowNone' => 'n',
51			'noneLabel' => 'None',
52			'realnames' => 'y',
53			'class' => 'form-control',
54	];
55
56	$params = array_merge($defaults, $params);
57	if (isset($params['size'])) {
58		$sz = ' size="' . $params['size'] . '"';
59	} else {
60		$sz = '';
61	}
62	if ($params['editable'] != 'y') {
63		$ed = ' disabled="disabled"';
64	} else {
65		$ed = '';
66	}
67	if ($params['multiple'] === 'true') {
68		$mt = ' multiple="multiple"';
69	} else {
70		$mt = '';
71	}
72
73	if (! empty($params['class'])) {
74		$class = ' class="' . $params['class'] . '"';
75	} else {
76		$class = '';
77	}
78
79	$groupNames = [];
80	if (is_array($params['groupIds'])) {
81		foreach ($params['groupIds'] as $k => $groupId) {
82			if ($groupId <= 0) {
83				unset($params['groupIds'][$k]);
84			}
85		}
86		if (! empty($params['groupIds'])) {
87			$groupIds = $params['groupIds'];
88		}
89	} elseif (! empty($params['groupIds'])) {
90		$groupIds = explode('|', $params['groupIds']);
91	}
92	if (! empty($groupIds)) {
93		foreach ($groupIds as $groupId) {
94			$group_info = $userlib->get_groupId_info($groupId);
95			$groupNames[] = $group_info['groupName'];
96		}
97	}
98
99	$users = [];
100	$ret = '';
101	if (! empty($groupNames)) {
102		$ucant = $userlib->count_users_consolidated($groupNames);
103	} else {
104		$ucant = $userlib->count_users('');
105	}
106
107	if ($prefs['feature_jquery_autocomplete'] == 'y' && ($ucant > $prefs['user_selector_threshold'] or $ucant > $params['user_selector_threshold'])) {
108		$ret .= '<input id="' . $params['id'] . '" type="text" name="' . $params['name'] . '" value="' . htmlspecialchars($params['user']) . '"' . $sz . $ed . ' style="' . $params['style'] . '"' . $class . ' />';
109		if (($params['contact'] == 'true')) {
110			$mode = ('usersandcontacts');
111		} elseif ($prefs['user_show_realnames'] === 'y' && $params['realnames'] === 'y') {
112			$mode = ('userrealname');
113		} else {
114			$mode = ('username');
115		}
116		$headerlib->add_jq_onready('$("#' . $params['id'] . '").tiki("autocomplete", "' . $mode . '", {mustMatch: ' . $params['mustmatch'] . ', multiple: ' . $params['multiple'] . ' });');
117	} else {
118		// get the user list
119		if ($params['group'] !== 'all') {
120			$groupNames[] = $params['group'];
121		}
122
123		// NOTE: if groupIds are present, the list of users is limited to those groups regardless of group == 'all'
124		if (! empty($groupNames)) {
125			$groupNames = array_unique($groupNames);
126			$usrs = [];
127			foreach ($groupNames as $groupName) {
128				$group_users = $userlib->get_group_users($groupName);
129				$usrs = array_merge($usrs, $group_users);
130			}
131			$usrs = array_unique($usrs);
132			foreach ($usrs as $usr) {
133				$users["$usr"] = $params['realnames'] === 'y' ? smarty_modifier_username($usr) : $usr;
134			}
135		}
136
137		if ($params['group'] == 'all' && empty($params['groupIds'])) {
138			$usrs = $tikilib->list_users(0, -1, 'login_asc');
139			foreach ($usrs['data'] as $usr) {
140				$users["{$usr['login']}"] = $params['realnames'] === 'y' ? smarty_modifier_username($usr['login']) : $usr['login'];
141			}
142		}
143
144		if ($params['realnames'] === 'y') {
145			$dupes = [];
146			foreach (array_count_values($users) as $usr => $c) {
147				if ($c > 1) {
148					$dupes[] = $usr;
149				}
150			}
151			foreach ($users as $usr => & $uname) {
152				if (in_array($uname, $dupes)) {
153					if ($prefs['login_is_email'] === 'y' && $prefs['login_is_email_obscure'] === 'y') {
154						$added = ' (' . substr($usr, strpos($usr, '@')) . ')';
155					} else {
156						$added = " ($usr)";
157					}
158					$uname .= $added;
159				}
160			}
161		}
162
163		asort($users, SORT_NATURAL | SORT_FLAG_CASE);
164
165		if ($params['multiple'] === 'true' && $params['allowNone'] === 'y') {
166			$ret .= '<input type="hidden" name="' . $params['name'] . '[]" value="">';
167		}
168
169		$ret .= '<select name="' . $params['name'] . ( $params['multiple'] === 'true' ? '[]' : '' ) . '" id="' . $params['id'] . '"' . $sz . $ed . $mt . ' style="' . $params['style'] . '" class="form-control">';
170		if ($params['allowNone'] === 'y') {
171			$ret .= '<option value=""' . (empty($params['user']) ? ' selected="selected"' : '') . ' >' . tra($params['noneLabel']) . '</option>';
172		}
173		foreach ($users as $usr => $usersname) {
174			$selected = isset($params['select']) && ( $params['select'] === $usr || (is_array($params['select']) && in_array($usr, $params['select'])) );
175			if ($params['editable'] == 'y' || $usr == $params['user'] || $selected) {
176				if (isset($params['select'])) {
177					$ret .= '<option value="' . htmlspecialchars($usr) . '"' . ($selected ? ' selected="selected"' : '') . ' >' . $usersname . '</option>';
178				} else {
179					$ret .= '<option value="' . htmlspecialchars($usr) . '"' . ($usr == $params['user'] ? ' selected="selected"' : '') . ' >' . $usersname . '</option>';
180				}
181			}
182		}
183		$ret .= '</select>';
184	}
185	return $ret;
186}
187