3 final class PHUIObjectBoxView
extends AphrontTagView
{
8 private $tabGroups = array();
9 private $formErrors = null;
12 private $validationException;
15 private $actionListID;
18 private $collapsed = false;
24 private $showHideHref;
25 private $showHideContent;
26 private $showHideOpen;
28 private $propertyLists = array();
29 private $tailButtons = array();
31 const COLOR_RED
= 'red';
32 const COLOR_BLUE
= 'blue';
33 const COLOR_GREEN
= 'green';
34 const COLOR_YELLOW
= 'yellow';
36 const BLUE
= 'phui-box-blue';
37 const BLUE_PROPERTY
= 'phui-box-blue-property';
38 const WHITE_CONFIG
= 'phui-box-white-config';
39 const GREY
= 'phui-box-grey';
41 public function addPropertyList(PHUIPropertyListView
$property_list) {
42 $this->propertyLists
[] = $property_list;
44 $action_list = $property_list->getActionList();
46 $this->actionListID
= celerity_generate_unique_node_id();
47 $action_list->setId($this->actionListID
);
53 public function setHeaderText($text) {
54 $this->headerText
= $text;
58 public function setColor($color) {
59 $this->color
= $color;
63 public function setBackground($color) {
64 $this->background
= $color;
68 public function setFormErrors(array $errors, $title = null) {
70 $this->formErrors
= id(new PHUIInfoView())
77 public function addTabGroup(PHUITabGroupView
$view) {
78 $this->tabGroups
[] = $view;
82 public function setInfoView(PHUIInfoView
$view) {
83 $this->infoView
= $view;
87 public function setForm($form) {
92 public function setHeader($header) {
93 $this->header
= $header;
97 public function setFlush($flush) {
98 $this->flush
= $flush;
102 public function setObjectList($list) {
103 $this->objectList
= $list;
107 public function setTable($table) {
108 $this->collapsed
= true;
109 $this->table
= $table;
113 public function setCollapsed($collapsed) {
114 $this->collapsed
= $collapsed;
118 public function setPager(PHUIPagerView
$pager) {
119 $this->pager
= $pager;
123 public function setAnchor(PhabricatorAnchorView
$anchor) {
124 $this->anchor
= $anchor;
128 public function setShowHide($show, $hide, $content, $href, $open = false) {
129 $this->showAction
= $show;
130 $this->hideAction
= $hide;
131 $this->showHideContent
= $content;
132 $this->showHideHref
= $href;
133 $this->showHideOpen
= $open;
137 public function setValidationException(
138 PhabricatorApplicationTransactionValidationException
$ex = null) {
139 $this->validationException
= $ex;
143 public function newTailButton() {
144 $button = id(new PHUIButtonView())
146 ->setColor(PHUIButtonView
::GREY
);
148 $this->tailButtons
[] = $button;
153 protected function getTagAttributes() {
155 $classes[] = 'phui-box';
156 $classes[] = 'phui-box-border';
157 $classes[] = 'phui-object-box';
158 $classes[] = 'mlt mll mlr';
161 $classes[] = 'phui-object-box-'.$this->color
;
164 if ($this->collapsed
) {
165 $classes[] = 'phui-object-box-collapsed';
169 $classes[] = 'phui-object-box-flush';
172 if ($this->background
) {
173 $classes[] = $this->background
;
177 'class' => implode(' ', $classes),
181 protected function getTagContent() {
182 require_celerity_resource('phui-box-css');
183 require_celerity_resource('phui-object-box-css');
185 $header = $this->header
;
187 if ($this->headerText
) {
188 $header = id(new PHUIHeaderView())
189 ->setHeader($this->headerText
);
193 if ($this->showAction
!== null) {
195 $header = id(new PHUIHeaderView());
198 Javelin
::initBehavior('phabricator-reveal-content');
200 $hide_action_id = celerity_generate_unique_node_id();
201 $show_action_id = celerity_generate_unique_node_id();
202 $content_id = celerity_generate_unique_node_id();
204 $hide_style = ($this->showHideOpen ?
'display: none;': null);
205 $show_style = ($this->showHideOpen ?
null : 'display: none;');
206 $hide_action = id(new PHUIButtonView())
208 ->addSigil('reveal-content')
209 ->setID($hide_action_id)
210 ->setStyle($hide_style)
211 ->setIcon('fa-search')
212 ->setHref($this->showHideHref
)
215 'hideIDs' => array($hide_action_id),
216 'showIDs' => array($content_id, $show_action_id),
218 ->setText($this->showAction
);
220 $show_action = id(new PHUIButtonView())
222 ->addSigil('reveal-content')
223 ->setStyle($show_style)
224 ->setIcon('fa-search')
226 ->setID($show_action_id)
229 'hideIDs' => array($content_id, $show_action_id),
230 'showIDs' => array($hide_action_id),
232 ->setText($this->hideAction
);
234 $header->addActionLink($hide_action);
235 $header->addActionLink($show_action);
241 'class' => 'phui-object-box-hidden-content',
243 'style' => $show_style,
245 $this->showHideContent
),
250 if ($this->actionListID
) {
251 $icon_id = celerity_generate_unique_node_id();
252 $icon = id(new PHUIIconView())
253 ->setIcon('fa-bars');
256 $this->actionListID
=> 'phabricator-action-list-toggle',
257 $icon_id => 'phuix-dropdown-open',
260 $mobile_menu = id(new PHUIButtonView())
262 ->setText(pht('Actions'))
265 ->addClass('phui-mobile-menu')
267 ->addSigil('jx-toggle-class')
268 ->setMetadata($meta);
269 $header->addActionLink($mobile_menu);
272 $ex = $this->validationException
;
273 $exception_errors = null;
276 foreach ($ex->getErrors() as $error) {
277 $messages[] = $error->getMessage();
280 $exception_errors = id(new PHUIInfoView())
281 ->setErrors($messages);
285 if ($this->propertyLists
) {
286 $lists = new PHUIPropertyGroupView();
289 foreach ($this->propertyLists
as $list) {
290 if ($ii > 0 ||
$this->tabGroups
) {
291 $list->addClass('phui-property-list-section-noninitial');
294 $lists->addPropertyList($list);
303 if ($this->pager
->willShowPagingControls()) {
304 $pager = phutil_tag_div('phui-object-box-pager', $this->pager
);
309 ($this->showHideOpen
== false ?
$this->anchor
: null),
317 ($this->showHideOpen
== true ?
$this->anchor
: null),
321 $this->renderChildren(),
324 if ($this->objectList
) {
325 $content[] = $this->objectList
;
328 if ($this->tailButtons
) {
329 $content[] = phutil_tag(
332 'class' => 'phui-object-box-tail-buttons',