Skip to content

Commit 9a6c912

Browse files
AnhNhanepriestley
authored and
epriestley
committedMar 26, 2013
Modernizing Flag Application
Summary: Fixes a weird string in the flag dialog Migrated to ObjectItemView (Cards) Removed filters from side nav (unnecessary) Go away, go away, panel. Nobody will miss you. Adding sorting/ordering to Flag (separation like in Maniphest ordering still remaining) Hacking our way in DifferentialRevisionListController thanks to panels (who added `->setFlush()` btw? It's awesome!) Test Plan: I would not dare to stand here if it did not work. Reviewers: epriestley, chad, btrahan Reviewed By: epriestley CC: aran, Korvin Differential Revision: https://secure.phabricator.com/D5449
1 parent 8fc94b0 commit 9a6c912

File tree

6 files changed

+137
-98
lines changed

6 files changed

+137
-98
lines changed
 

‎src/applications/differential/controller/DifferentialRevisionListController.php

+1-26
Original file line numberDiff line numberDiff line change
@@ -146,9 +146,7 @@ public function processRequest() {
146146
$handles = $this->loadViewerHandles($phids);
147147

148148
foreach ($views as $view) {
149-
if (empty($view['special'])) {
150-
$view['view']->setHandles($handles);
151-
}
149+
$view['view']->setHandles($handles);
152150
$panel = new AphrontPanelView();
153151
$panel->setHeader($view['title']);
154152
$panel->appendChild($view['view']);
@@ -460,29 +458,6 @@ private function buildViews($filter, array $user_phids, array $revisions) {
460458
'view' => $view,
461459
);
462460

463-
// Flags are sort of private, so only show the flag panel if you're
464-
// looking at your own requests.
465-
if (in_array($user->getPHID(), $user_phids)) {
466-
$flags = id(new PhabricatorFlagQuery())
467-
->setViewer($user)
468-
->withOwnerPHIDs(array($user->getPHID()))
469-
->withTypes(array(PhabricatorPHIDConstants::PHID_TYPE_DREV))
470-
->needHandles(true)
471-
->execute();
472-
473-
if ($flags) {
474-
$view = id(new PhabricatorFlagListView())
475-
->setFlags($flags)
476-
->setUser($user);
477-
478-
$views[] = array(
479-
'title' => pht('Flagged Revisions'),
480-
'view' => $view,
481-
'special' => true,
482-
);
483-
}
484-
}
485-
486461
$view = id(clone $template)
487462
->setRevisions($waiting)
488463
->loadAssets();

‎src/applications/flag/controller/PhabricatorFlagEditController.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ public function processRequest() {
5454
$form
5555
->appendChild(hsprintf(
5656
"<p>%s</p><br />",
57-
pht('You can flag this %s if you want to remember to look ".
58-
"at it later.',
57+
pht('You can flag this %s if you want to remember to look '.
58+
'at it later.',
5959
$type_name)));
6060
}
6161

‎src/applications/flag/controller/PhabricatorFlagListController.php

+44-10
Original file line numberDiff line numberDiff line change
@@ -7,33 +7,67 @@ public function processRequest() {
77
$user = $request->getUser();
88

99
$nav = new AphrontSideNavFilterView();
10-
$nav->setBaseURI(new PhutilURI('/flag/view/'));
11-
$nav->addLabel(pht('Flags'));
12-
$nav->addFilter('all', pht('Your Flags'));
13-
$nav->selectFilter('all', 'all');
10+
11+
$filter_form = new AphrontFormView();
12+
$filter_form->setUser($user);
13+
$filter_form->appendChild(
14+
id(new AphrontFormToggleButtonsControl())
15+
->setName('o')
16+
->setLabel(pht('Sort Order'))
17+
->setBaseURI($request->getRequestURI(), 'o')
18+
->setValue($request->getStr('o', 'n'))
19+
->setButtons(
20+
array(
21+
'n' => pht('Date'),
22+
'c' => pht('Color'),
23+
'o' => pht('Object Type'),
24+
'r' => pht('Reason'),
25+
)));
26+
27+
$filter = new AphrontListFilterView();
28+
$filter->appendChild($filter_form);
1429

1530
$query = new PhabricatorFlagQuery();
1631
$query->withOwnerPHIDs(array($user->getPHID()));
1732
$query->setViewer($user);
1833
$query->needHandles(true);
1934

35+
switch ($request->getStr('o', 'n')) {
36+
case 'n':
37+
$order = PhabricatorFlagQuery::ORDER_ID;
38+
break;
39+
case 'c':
40+
$order = PhabricatorFlagQuery::ORDER_COLOR;
41+
break;
42+
case 'o':
43+
$order = PhabricatorFlagQuery::ORDER_OBJECT;
44+
break;
45+
case 'r':
46+
$order = PhabricatorFlagQuery::ORDER_REASON;
47+
break;
48+
default:
49+
throw new Exception("Unknown order!");
50+
}
51+
$query->withOrder($order);
52+
2053
$flags = $query->execute();
2154

2255
$view = new PhabricatorFlagListView();
2356
$view->setFlags($flags);
2457
$view->setUser($user);
2558

26-
$panel = new AphrontPanelView();
27-
$panel->setHeader(pht('Flags'));
28-
$panel->appendChild($view);
29-
$panel->setNoBackground();
59+
$header = new PhabricatorHeaderView();
60+
$header->setHeader(pht('Flags'));
3061

31-
$nav->appendChild($panel);
62+
$nav->appendChild($header);
63+
$nav->appendChild($filter);
64+
$nav->appendChild($view);
3265

33-
return $this->buildStandardPageResponse(
66+
return $this->buildApplicationPage(
3467
$nav,
3568
array(
3669
'title' => pht('Flags'),
70+
'dust' => true,
3771
));
3872
}
3973

‎src/applications/flag/query/PhabricatorFlagQuery.php

+34-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,12 @@ final class PhabricatorFlagQuery {
1313
private $needObjects;
1414
private $viewer;
1515

16+
private $order = 'order-id';
17+
const ORDER_ID = 'order-id';
18+
const ORDER_COLOR = 'order-color';
19+
const ORDER_OBJECT = 'order-object';
20+
const ORDER_REASON = 'order-reason';
21+
1622
public function setViewer($viewer) {
1723
$this->viewer = $viewer;
1824
return $this;
@@ -33,6 +39,11 @@ public function withObjectPHIDs(array $object_phids) {
3339
return $this;
3440
}
3541

42+
public function withOrder($order) {
43+
$this->order = $order;
44+
return $this;
45+
}
46+
3647
public function needHandles($need) {
3748
$this->needHandles = $need;
3849
return $this;
@@ -143,7 +154,29 @@ private function buildWhereClause($conn_r) {
143154
}
144155

145156
private function buildOrderClause($conn_r) {
146-
return 'ORDER BY id DESC';
157+
return qsprintf($conn_r,
158+
'ORDER BY %Q',
159+
$this->getOrderColumn($conn_r));
160+
}
161+
162+
private function getOrderColumn($conn_r) {
163+
switch ($this->order) {
164+
case self::ORDER_ID:
165+
return 'id DESC';
166+
break;
167+
case self::ORDER_COLOR:
168+
return 'color DESC';
169+
break;
170+
case self::ORDER_OBJECT:
171+
return 'type ASC';
172+
break;
173+
case self::ORDER_REASON:
174+
return 'reasonPHID DESC';
175+
break;
176+
default:
177+
throw new Exception("Unknown order {$this->order}!");
178+
break;
179+
}
147180
}
148181

149182
private function buildLimitClause($conn_r) {

‎src/applications/flag/view/PhabricatorFlagListView.php

+49-59
Original file line numberDiff line numberDiff line change
@@ -3,82 +3,72 @@
33
final class PhabricatorFlagListView extends AphrontView {
44

55
private $flags;
6+
private $flush = false;
67

78
public function setFlags(array $flags) {
89
assert_instances_of($flags, 'PhabricatorFlag');
910
$this->flags = $flags;
1011
return $this;
1112
}
1213

14+
public function setFlush($flush) {
15+
$this->flush = $flush;
16+
return $this;
17+
}
18+
1319
public function render() {
1420
$user = $this->user;
1521

1622
require_celerity_resource('phabricator-flag-css');
1723

24+
$list = new PhabricatorObjectItemListView();
25+
$list->setCards(true);
26+
$list->setNoDataString(pht('No flags.'));
27+
$list->setFlush($this->flush);
28+
1829
$rows = array();
1930
foreach ($this->flags as $flag) {
2031
$class = PhabricatorFlagColor::getCSSClass($flag->getColor());
2132

22-
$rows[] = array(
23-
phutil_tag(
24-
'div',
25-
array(
26-
'class' => 'phabricator-flag-icon '.$class,
27-
),
28-
''),
29-
$flag->getHandle()->renderLink(),
30-
$flag->getNote(),
31-
phabricator_datetime($flag->getDateCreated(), $user),
32-
phabricator_form(
33-
$user,
34-
array(
35-
'method' => 'POST',
36-
'action' => '/flag/edit/'.$flag->getObjectPHID().'/',
37-
'sigil' => 'workflow',
38-
),
39-
phutil_tag(
40-
'button',
41-
array(
42-
'class' => 'small grey',
43-
),
44-
pht('Edit Flag'))),
45-
phabricator_form(
46-
$user,
47-
array(
48-
'method' => 'POST',
49-
'action' => '/flag/delete/'.$flag->getID().'/',
50-
'sigil' => 'workflow',
51-
),
52-
phutil_tag(
53-
'button',
54-
array(
55-
'class' => 'small grey',
56-
),
57-
pht('Remove Flag'))),
58-
);
33+
$flag_icon = phutil_tag(
34+
'div',
35+
array(
36+
'class' => 'phabricator-flag-icon '.$class,
37+
),
38+
'');
39+
40+
$edit_link = javelin_tag(
41+
'a',
42+
array(
43+
'href' => '/flag/edit/'.$flag->getObjectPHID().'/',
44+
'sigil' => 'workflow',
45+
),
46+
pht('Edit'));
47+
48+
$remove_link = javelin_tag(
49+
'a',
50+
array(
51+
'href' => '/flag/delete/'.$flag->getID().'/',
52+
'sigil' => 'workflow',
53+
),
54+
pht('Remove'));
55+
56+
$item = new PhabricatorObjectItemView();
57+
$item->addIcon('edit', $edit_link);
58+
$item->addIcon('delete', $remove_link);
59+
60+
$item->setHeader(hsprintf('%s %s',
61+
$flag_icon, $flag->getHandle()->renderLink()));
62+
63+
$item->addAttribute(phabricator_datetime($flag->getDateCreated(), $user));
64+
65+
if ($flag->getNote()) {
66+
$item->addAttribute($flag->getNote());
67+
}
68+
69+
$list->addItem($item);
5970
}
6071

61-
$table = new AphrontTableView($rows);
62-
$table->setHeaders(
63-
array(
64-
'',
65-
pht('Flagged Object'),
66-
pht('Note'),
67-
pht('Flagged On'),
68-
'',
69-
'',
70-
));
71-
$table->setColumnClasses(
72-
array(
73-
'narrow',
74-
'wrap pri',
75-
'wrap',
76-
'narrow',
77-
'narrow action',
78-
'narrow action',
79-
));
80-
$table->setNoDataString(pht('No flags.'));
81-
82-
return $table->render();
72+
return $list;
8373
}
8474
}

‎webroot/rsrc/css/application/flag/flag.css

+7
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,13 @@
77
background: transparent 0 0 no-repeat;
88
}
99

10+
.phabricator-object-item .phabricator-flag-icon {
11+
float: left;
12+
margin: 2px;
13+
margin-right: 8px;
14+
margin-bottom: 0;
15+
}
16+
1017
.phabricator-flag-radio {
1118
padding-left: 18px;
1219
margin: 1px;

0 commit comments

Comments
 (0)
Failed to load comments.