@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 DivinerAtomSearchEngine extends PhabricatorApplicationSearchEngine {
4
5 public function getResultTypeDescription() {
6 return pht('Documentation Atoms');
7 }
8
9 public function getApplicationClassName() {
10 return PhabricatorDivinerApplication::class;
11 }
12
13 public function canUseInPanelContext() {
14 return false;
15 }
16
17 public function buildSavedQueryFromRequest(AphrontRequest $request) {
18 $saved = new PhabricatorSavedQuery();
19
20 $saved->setParameter(
21 'bookPHIDs',
22 $this->readPHIDsFromRequest($request, 'bookPHIDs'));
23 $saved->setParameter(
24 'repositoryPHIDs',
25 $this->readPHIDsFromRequest($request, 'repositoryPHIDs'));
26 $saved->setParameter('name', $request->getStr('name'));
27 $saved->setParameter(
28 'types',
29 $this->readListFromRequest($request, 'types'));
30
31 return $saved;
32 }
33
34 public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
35 $query = new DivinerAtomQuery();
36
37 $books = $saved->getParameter('bookPHIDs');
38 if ($books) {
39 $query->withBookPHIDs($books);
40 }
41
42 $repository_phids = $saved->getParameter('repositoryPHIDs');
43 if ($repository_phids) {
44 $query->withRepositoryPHIDs($repository_phids);
45 }
46
47 $name = $saved->getParameter('name');
48 if ($name) {
49 $query->withNameContains($name);
50 }
51
52 $types = $saved->getParameter('types');
53 if ($types) {
54 $query->withTypes($types);
55 }
56
57 return $query;
58 }
59
60 public function buildSearchForm(
61 AphrontFormView $form,
62 PhabricatorSavedQuery $saved) {
63
64 $form->appendChild(
65 id(new AphrontFormTextControl())
66 ->setLabel(pht('Name Contains'))
67 ->setName('name')
68 ->setValue($saved->getParameter('name')));
69
70 $all_types = array();
71 foreach (DivinerAtom::getAllTypes() as $type) {
72 $all_types[$type] = DivinerAtom::getAtomTypeNameString($type);
73 }
74 asort($all_types);
75
76 $types = $saved->getParameter('types', array());
77 $types = array_fuse($types);
78 $type_control = id(new AphrontFormCheckboxControl())
79 ->setLabel(pht('Types'));
80 foreach ($all_types as $type => $name) {
81 $type_control->addCheckbox(
82 'types[]',
83 $type,
84 $name,
85 isset($types[$type]));
86 }
87 $form->appendChild($type_control);
88
89 $form->appendControl(
90 id(new AphrontFormTokenizerControl())
91 ->setDatasource(new DivinerBookDatasource())
92 ->setName('bookPHIDs')
93 ->setLabel(pht('Books'))
94 ->setValue($saved->getParameter('bookPHIDs')));
95
96 $form->appendControl(
97 id(new AphrontFormTokenizerControl())
98 ->setLabel(pht('Repositories'))
99 ->setName('repositoryPHIDs')
100 ->setDatasource(new DiffusionRepositoryDatasource())
101 ->setValue($saved->getParameter('repositoryPHIDs')));
102 }
103
104 protected function getURI($path) {
105 return '/diviner/'.$path;
106 }
107
108 protected function getBuiltinQueryNames() {
109 return array(
110 'all' => pht('All Atoms'),
111 );
112 }
113
114 public function buildSavedQueryFromBuiltin($query_key) {
115 $query = $this->newSavedQuery();
116 $query->setQueryKey($query_key);
117
118 switch ($query_key) {
119 case 'all':
120 return $query;
121 }
122
123 return parent::buildSavedQueryFromBuiltin($query_key);
124 }
125
126 /**
127 * @param array<DivinerLiveSymbol> $symbols
128 * @param PhabricatorSavedQuery $query
129 * @param array<PhabricatorObjectHandle> $handles
130 */
131 protected function renderResultList(
132 array $symbols,
133 PhabricatorSavedQuery $query,
134 array $handles) {
135
136 assert_instances_of($symbols, DivinerLiveSymbol::class);
137
138 $viewer = $this->requireViewer();
139
140 $list = id(new PHUIObjectItemListView())
141 ->setUser($viewer);
142
143 foreach ($symbols as $symbol) {
144 $type = $symbol->getType();
145 $type_name = DivinerAtom::getAtomTypeNameString($type);
146
147 $item = id(new PHUIObjectItemView())
148 ->setHeader($symbol->getTitle())
149 ->setHref($symbol->getURI())
150 ->addAttribute($symbol->getSummary())
151 ->addIcon('none', $type_name);
152
153 $list->addItem($item);
154 }
155
156 $result = new PhabricatorApplicationSearchResultView();
157 $result->setObjectList($list);
158 $result->setNoDataString(pht('No books found.'));
159
160 return $result;
161 }
162
163}