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/**
9 * Handler class for Freetags
10 *
11 * Letter key: ~F~
12 *
13 */
14class Tracker_Field_Freetags extends Tracker_Field_Abstract implements Tracker_Field_Synchronizable, Tracker_Field_Exportable, Tracker_Field_Filterable
15{
16	public static function getTypes()
17	{
18		return [
19			'F' => [
20				'name' => tr('Tags'),
21				'description' => tr('Allow tags to be shown or added for tracker items.'),
22				'prefs' => ['trackerfield_freetags', 'feature_freetags'],
23				'tags' => ['advanced'],
24				'default' => 'y',
25				'params' => [
26					'size' => [
27						'name' => tr('Size'),
28						'description' => tr('Visible size of the input field'),
29						'filter' => 'int',
30						'legacy_index' => 0,
31					],
32					'hidehelp' => [
33						'name' => tr('Help'),
34						'description' => tr('Hide or show the input help'),
35						'default' => '',
36						'filter' => 'alpha',
37						'options' => [
38							'' => tr('Show'),
39							'y' => tr('Hide'),
40						],
41						'legacy_index' => 1,
42					],
43					'hidesuggest' => [
44						'name' => tr('Suggest'),
45						'description' => tr('Hide or show the tag suggestions'),
46						'default' => '',
47						'filter' => 'alpha',
48						'options' => [
49							'' => tr('Show'),
50							'y' => tr('Hide'),
51							'all' => tr('Show them all, ordered by popularity'),
52						],
53						'legacy_index' => 2,
54					],
55				],
56			],
57		];
58	}
59
60	function getFieldData(array $requestData = [])
61	{
62		$data = [];
63
64		$ins_id = $this->getInsertId();
65
66		if (isset($requestData[$ins_id])) {
67			$data['value'] = $requestData[$ins_id];
68		} else {
69			global $prefs;
70
71			$data['value'] = $this->getValue();
72
73			$langutil = new Services_Language_Utilities;
74			$itemLang = null;
75			if ($this->getItemId()) {
76				try {
77					$itemLang = $langutil->getLanguage('trackeritem', $this->getItemId());
78				} catch (Services_Exception $e) {
79					$itemLang = null;
80				}
81			}
82			$freetaglib = TikiLib::lib('freetag');
83			$data['freetags'] = $freetaglib->_parse_tag($data['value']);
84			if ($this->getOption('hidesuggest') == '') {
85				$data['tag_suggestion'] = $freetaglib->get_tag_suggestion(
86					implode(' ', $data['freetags']),
87					$prefs['freetags_browse_amount_tags_suggestion'],
88					$itemLang
89				);
90			} else {
91				$data['all_tags'] = $freetaglib->silly_list(-1);
92			}
93		}
94
95		return $data;
96	}
97
98	function addValue($value) {
99		$freetaglib = TikiLib::lib('freetag');
100		$tags = $freetaglib->_parse_tag($this->getValue());
101		if (! in_array($value, $tags)) {
102			$tags[] = $value;
103		}
104		return implode(' ', array_map(function($t){
105			return strstr($t, ' ') ? '"'.$t.'"' : $t;
106		}, $tags));
107	}
108
109	function removeValue($value) {
110		$freetaglib = TikiLib::lib('freetag');
111		$tags = $freetaglib->_parse_tag($this->getValue());
112		$tags = array_filter($tags, function($t) use ($value) {
113			return $t != $value;
114		});
115		return implode(' ', array_map(function($t){
116			return strstr($t, ' ') ? '"'.$t.'"' : $t;
117		}, $tags));
118	}
119
120	function renderInput($context = [])
121	{
122		return $this->renderTemplate('trackerinput/freetags.tpl', $context);
123	}
124
125	function renderOutput($context = [])
126	{
127		return $this->renderTemplate('trackeroutput/freetags.tpl', $context);
128	}
129
130	function importRemote($value)
131	{
132		return $value;
133	}
134
135	function exportRemote($value)
136	{
137		return $value;
138	}
139
140	function importRemoteField(array $info, array $syncInfo)
141	{
142		return $info;
143	}
144
145	function getTabularSchema()
146	{
147		$schema = new Tracker\Tabular\Schema($this->getTrackerDefinition());
148
149		$permName = $this->getConfiguration('permName');
150		$name = $this->getConfiguration('name');
151
152		$schema->addNew($permName, 'default')
153			->setLabel($name)
154			->setRenderTransform(function ($value) {
155				return $value;
156			})
157			->setParseIntoTransform(function (& $info, $value) use ($permName) {
158				$info['fields'][$permName] = $value;
159			});
160
161		return $schema;
162	}
163
164	function getFilterCollection()
165	{
166		$filters = new Tracker\Filter\Collection($this->getTrackerDefinition());
167		$permName = $this->getConfiguration('permName');
168		$name = $this->getConfiguration('name');
169		$baseKey = $this->getBaseKey();
170
171
172		$filters->addNew($permName, 'lookup')
173			->setLabel($name)
174			->setControl(new Tracker\Filter\Control\TextField("tf_{$permName}_lookup"))
175			->setApplyCondition(function ($control, Search_Query $query) use ($baseKey) {
176				$value = $control->getValue();
177
178				if ($value) {
179					$query->filterContent($value, $baseKey);
180				}
181			})
182			;
183
184		return $filters;
185	}
186}
187