@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 PhabricatorSpacesNamespaceSearchEngine
4 extends PhabricatorApplicationSearchEngine {
5
6 public function getApplicationClassName() {
7 return PhabricatorSpacesApplication::class;
8 }
9
10 public function getResultTypeDescription() {
11 return pht('Spaces');
12 }
13
14 public function newQuery() {
15 return new PhabricatorSpacesNamespaceQuery();
16 }
17
18 protected function buildCustomSearchFields() {
19 return array(
20 id(new PhabricatorSearchThreeStateField())
21 ->setLabel(pht('Active'))
22 ->setKey('active')
23 ->setOptions(
24 pht('(Show All)'),
25 pht('Show Only Active Spaces'),
26 pht('Hide Active Spaces')),
27 );
28 }
29
30 protected function buildQueryFromParameters(array $map) {
31 $query = $this->newQuery();
32
33 if ($map['active']) {
34 $query->withIsArchived(!$map['active']);
35 }
36
37 return $query;
38 }
39
40 protected function getURI($path) {
41 return '/spaces/'.$path;
42 }
43
44 protected function getBuiltinQueryNames() {
45 $names = array(
46 'active' => pht('Active Spaces'),
47 'all' => pht('All Spaces'),
48 );
49
50 return $names;
51 }
52
53 public function buildSavedQueryFromBuiltin($query_key) {
54 $query = $this->newSavedQuery();
55 $query->setQueryKey($query_key);
56
57 switch ($query_key) {
58 case 'active':
59 return $query->setParameter('active', true);
60 case 'all':
61 return $query;
62 }
63
64 return parent::buildSavedQueryFromBuiltin($query_key);
65 }
66
67 /**
68 * @param array<PhabricatorSpacesNamespace> $spaces
69 * @param PhabricatorSavedQuery $query
70 * @param array<PhabricatorObjectHandle> $handles
71 */
72 protected function renderResultList(
73 array $spaces,
74 PhabricatorSavedQuery $query,
75 array $handles) {
76 assert_instances_of($spaces, PhabricatorSpacesNamespace::class);
77
78 $viewer = $this->requireViewer();
79
80 $list = new PHUIObjectItemListView();
81 $list->setViewer($viewer);
82 foreach ($spaces as $space) {
83 $item = id(new PHUIObjectItemView())
84 ->setObjectName($space->getMonogram())
85 ->setHeader($space->getNamespaceName())
86 ->setHref('/'.$space->getMonogram());
87
88 if ($space->getIsDefaultNamespace()) {
89 $item->addIcon('fa-certificate', pht('Default Space'));
90 }
91
92 if ($space->getIsArchived()) {
93 $item->setDisabled(true);
94 }
95
96 $list->addItem($item);
97 }
98
99 $result = new PhabricatorApplicationSearchResultView();
100 $result->setObjectList($list);
101 $result->setNoDataString(pht('No spaces found.'));
102
103 return $result;
104 }
105
106 protected function getNewUserBody() {
107 $create_button = id(new PHUIButtonView())
108 ->setTag('a')
109 ->setText(pht('Create a Space'))
110 ->setHref('/spaces/create/')
111 ->setColor(PHUIButtonView::GREEN);
112
113 $icon = $this->getApplication()->getIcon();
114 $app_name = $this->getApplication()->getName();
115 $view = id(new PHUIBigInfoView())
116 ->setIcon($icon)
117 ->setTitle(pht('Welcome to %s', $app_name))
118 ->setDescription(
119 pht('Policy namespaces to segment object visibility throughout your '.
120 'instance.'))
121 ->addAction($create_button);
122
123 return $view;
124 }
125
126}