@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 PhabricatorOwnersPackageSearchEngine
4 extends PhabricatorApplicationSearchEngine {
5
6 public function getResultTypeDescription() {
7 return pht('Owners Packages');
8 }
9
10 public function getApplicationClassName() {
11 return PhabricatorOwnersApplication::class;
12 }
13
14 public function newQuery() {
15 return new PhabricatorOwnersPackageQuery();
16 }
17
18 protected function buildCustomSearchFields() {
19 return array(
20 id(new PhabricatorSearchDatasourceField())
21 ->setLabel(pht('Authority'))
22 ->setKey('authorityPHIDs')
23 ->setAliases(array('authority', 'authorities'))
24 ->setConduitKey('owners')
25 ->setDescription(
26 pht('Search for packages with specific owners.'))
27 ->setDatasource(new PhabricatorProjectOrUserDatasource()),
28 id(new PhabricatorSearchTextField())
29 ->setLabel(pht('Name Contains'))
30 ->setKey('name')
31 ->setDescription(pht('Search for packages by name substrings.')),
32 id(new PhabricatorSearchDatasourceField())
33 ->setLabel(pht('Repositories'))
34 ->setKey('repositoryPHIDs')
35 ->setConduitKey('repositories')
36 ->setAliases(array('repository', 'repositories'))
37 ->setDescription(
38 pht('Search for packages by included repositories.'))
39 ->setDatasource(new DiffusionRepositoryDatasource()),
40 id(new PhabricatorSearchStringListField())
41 ->setLabel(pht('Paths'))
42 ->setKey('paths')
43 ->setAliases(array('path'))
44 ->setDescription(
45 pht('Search for packages affecting specific paths.')),
46 id(new PhabricatorSearchCheckboxesField())
47 ->setKey('statuses')
48 ->setLabel(pht('Status'))
49 ->setDescription(
50 pht('Search for active or archived packages.'))
51 ->setOptions(
52 id(new PhabricatorOwnersPackage())
53 ->getStatusNameMap()),
54 );
55 }
56
57 protected function buildQueryFromParameters(array $map) {
58 $query = $this->newQuery();
59
60 if ($map['authorityPHIDs']) {
61 $query->withAuthorityPHIDs($map['authorityPHIDs']);
62 }
63
64 if ($map['repositoryPHIDs']) {
65 $query->withRepositoryPHIDs($map['repositoryPHIDs']);
66 }
67
68 if ($map['paths']) {
69 $query->withPaths($map['paths']);
70 }
71
72 if ($map['statuses']) {
73 $query->withStatuses($map['statuses']);
74 }
75
76 if (strlen($map['name'])) {
77 $query->withNameNgrams($map['name']);
78 }
79
80 return $query;
81 }
82
83 protected function getURI($path) {
84 return '/owners/'.$path;
85 }
86
87 protected function getBuiltinQueryNames() {
88 $names = array();
89
90 if ($this->requireViewer()->isLoggedIn()) {
91 $names['authority'] = pht('Owned');
92 }
93
94 $names += array(
95 'active' => pht('Active Packages'),
96 'all' => pht('All Packages'),
97 );
98
99 return $names;
100 }
101
102 public function buildSavedQueryFromBuiltin($query_key) {
103 $query = $this->newSavedQuery();
104 $query->setQueryKey($query_key);
105
106 switch ($query_key) {
107 case 'all':
108 return $query;
109 case 'active':
110 return $query->setParameter(
111 'statuses',
112 array(
113 PhabricatorOwnersPackage::STATUS_ACTIVE,
114 ));
115 case 'authority':
116 return $query->setParameter(
117 'authorityPHIDs',
118 array($this->requireViewer()->getPHID()));
119 }
120
121 return parent::buildSavedQueryFromBuiltin($query_key);
122 }
123
124 /**
125 * @param array<PhabricatorOwnersPackage> $packages
126 * @param PhabricatorSavedQuery $query
127 * @param array<PhabricatorObjectHandle> $handles
128 */
129 protected function renderResultList(
130 array $packages,
131 PhabricatorSavedQuery $query,
132 array $handles) {
133 assert_instances_of($packages, PhabricatorOwnersPackage::class);
134
135 $viewer = $this->requireViewer();
136
137 $list = id(new PHUIObjectItemListView())
138 ->setUser($viewer);
139 foreach ($packages as $package) {
140 $id = $package->getID();
141
142 $item = id(new PHUIObjectItemView())
143 ->setObject($package)
144 ->setObjectName($package->getMonogram())
145 ->setHeader($package->getName())
146 ->setHref($package->getURI());
147
148 if ($package->isArchived()) {
149 $item->setDisabled(true);
150 }
151
152 $list->addItem($item);
153 }
154
155 $result = new PhabricatorApplicationSearchResultView();
156 $result->setObjectList($list);
157 $result->setNoDataString(pht('No packages found.'));
158
159 return $result;
160
161 }
162
163 protected function getNewUserBody() {
164 $create_button = id(new PHUIButtonView())
165 ->setTag('a')
166 ->setText(pht('Create a Package'))
167 ->setHref('/owners/edit/')
168 ->setColor(PHUIButtonView::GREEN);
169
170 $icon = $this->getApplication()->getIcon();
171 $app_name = $this->getApplication()->getName();
172 $view = id(new PHUIBigInfoView())
173 ->setIcon($icon)
174 ->setTitle(pht('Welcome to %s', $app_name))
175 ->setDescription(
176 pht(
177 'Group sections of a codebase into packages for re-use in other '.
178 'applications, like Herald rules.'))
179 ->addAction($create_button);
180
181 return $view;
182 }
183
184}