@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.)
hq.recaptime.dev/wiki/Phorge
phorge
phabricator
1<?php
2
3final class PhabricatorFlagSearchEngine
4 extends PhabricatorApplicationSearchEngine {
5
6 public function getResultTypeDescription() {
7 return pht('Flags');
8 }
9
10 public function getApplicationClassName() {
11 return PhabricatorFlagsApplication::class;
12 }
13
14 public function buildSavedQueryFromRequest(AphrontRequest $request) {
15 $saved = new PhabricatorSavedQuery();
16 $saved->setParameter('colors', $request->getArr('colors'));
17 $saved->setParameter('group', $request->getStr('group'));
18 $saved->setParameter('objectFilter', $request->getStr('objectFilter'));
19 return $saved;
20 }
21
22 public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
23 $query = id(new PhabricatorFlagQuery())
24 ->needHandles(true)
25 ->withOwnerPHIDs(array($this->requireViewer()->getPHID()));
26
27 $colors = $saved->getParameter('colors');
28 if ($colors) {
29 $query->withColors($colors);
30 }
31 $group = $saved->getParameter('group');
32 $options = $this->getGroupOptions();
33 if ($group && isset($options[$group])) {
34 $query->setGroupBy($group);
35 }
36
37 $object_filter = $saved->getParameter('objectFilter');
38 $objects = $this->getObjectFilterOptions();
39 if ($object_filter && isset($objects[$object_filter])) {
40 $query->withTypes(array($object_filter));
41 }
42
43 return $query;
44 }
45
46 public function buildSearchForm(
47 AphrontFormView $form,
48 PhabricatorSavedQuery $saved_query) {
49
50 $form
51 ->appendChild(
52 id(new PhabricatorFlagSelectControl())
53 ->setName('colors')
54 ->setLabel(pht('Colors'))
55 ->setValue($saved_query->getParameter('colors', array())))
56 ->appendChild(
57 id(new AphrontFormSelectControl())
58 ->setName('group')
59 ->setLabel(pht('Group By'))
60 ->setValue($saved_query->getParameter('group'))
61 ->setOptions($this->getGroupOptions()))
62 ->appendChild(
63 id(new AphrontFormSelectControl())
64 ->setName('objectFilter')
65 ->setLabel(pht('Object Type'))
66 ->setValue($saved_query->getParameter('objectFilter'))
67 ->setOptions($this->getObjectFilterOptions()));
68 }
69
70 protected function getURI($path) {
71 return '/flag/'.$path;
72 }
73
74 protected function getBuiltinQueryNames() {
75 $names = array(
76 'all' => pht('Flagged'),
77 );
78
79 return $names;
80 }
81
82 public function buildSavedQueryFromBuiltin($query_key) {
83
84 $query = $this->newSavedQuery();
85 $query->setQueryKey($query_key);
86
87 switch ($query_key) {
88 case 'all':
89 return $query;
90 }
91
92 return parent::buildSavedQueryFromBuiltin($query_key);
93 }
94
95 private function getGroupOptions() {
96 return array(
97 PhabricatorFlagQuery::GROUP_NONE => pht('None'),
98 PhabricatorFlagQuery::GROUP_COLOR => pht('Color'),
99 );
100 }
101
102 private function getObjectFilterOptions() {
103 $objects = id(new PhutilClassMapQuery())
104 ->setAncestorClass(PhabricatorFlaggableInterface::class)
105 ->execute();
106
107 $all_types = PhabricatorPHIDType::getAllTypes();
108 $options = array();
109
110 foreach ($objects as $object) {
111 $phid = $object->generatePHID();
112 $phid_type = phid_get_type($phid);
113 $type_object = idx($all_types, $phid_type);
114 if ($type_object) {
115 $options[$phid_type] = $type_object->getTypeName();
116 }
117 }
118 // sort it alphabetically...
119 asort($options);
120 $default_option = array(
121 0 => pht('All Object Types'),
122 );
123 // ...and stick the default option on front
124 $options = array_merge($default_option, $options);
125
126 return $options;
127 }
128
129 /**
130 * @param array<PhabricatorFlag> $flags
131 * @param PhabricatorSavedQuery $query
132 * @param array<PhabricatorObjectHandle> $handles
133 */
134 protected function renderResultList(
135 array $flags,
136 PhabricatorSavedQuery $query,
137 array $handles) {
138 assert_instances_of($flags, PhabricatorFlag::class);
139
140 $viewer = $this->requireViewer();
141
142 $list = id(new PHUIObjectItemListView())
143 ->setUser($viewer);
144 foreach ($flags as $flag) {
145 $id = $flag->getID();
146 $phid = $flag->getObjectPHID();
147
148 $class = PhabricatorFlagColor::getCSSClass($flag->getColor());
149
150 $flag_icon = phutil_tag(
151 'div',
152 array(
153 'class' => 'phabricator-flag-icon '.$class,
154 ),
155 '');
156
157 $item = id(new PHUIObjectItemView())
158 ->addHeadIcon($flag_icon)
159 ->setHeader($flag->getHandle()->getFullName())
160 ->setHref($flag->getHandle()->getURI());
161
162 $status_open = PhabricatorObjectHandle::STATUS_OPEN;
163 if ($flag->getHandle()->getStatus() != $status_open) {
164 $item->setDisabled(true);
165 }
166
167 $item->addAction(
168 id(new PHUIListItemView())
169 ->setIcon('fa-pencil')
170 ->setHref($this->getApplicationURI("edit/{$phid}/"))
171 ->setWorkflow(true));
172
173 $item->addAction(
174 id(new PHUIListItemView())
175 ->setIcon('fa-times')
176 ->setHref($this->getApplicationURI("delete/{$id}/"))
177 ->setWorkflow(true));
178
179 if ($flag->getNote()) {
180 $item->addAttribute($flag->getNote());
181 }
182
183 $item->addIcon(
184 'none',
185 phabricator_datetime($flag->getDateCreated(), $viewer));
186
187 $list->addItem($item);
188 }
189
190 $result = new PhabricatorApplicationSearchResultView();
191 $result->setObjectList($list);
192 $result->setNoDataString(pht('No flags found.'));
193
194 return $result;
195
196 }
197
198
199}