Path: blob/master/src/view/phui/PHUIObjectBoxView.php
12249 views
<?php12final class PHUIObjectBoxView extends AphrontTagView {34private $headerText;5private $color;6private $background;7private $tabGroups = array();8private $formErrors = null;9private $infoView;10private $form;11private $validationException;12private $header;13private $flush;14private $actionListID;15private $objectList;16private $table;17private $collapsed = false;18private $anchor;19private $pager;2021private $showAction;22private $hideAction;23private $showHideHref;24private $showHideContent;25private $showHideOpen;2627private $propertyLists = array();28private $tailButtons = array();2930const COLOR_RED = 'red';31const COLOR_BLUE = 'blue';32const COLOR_GREEN = 'green';33const COLOR_YELLOW = 'yellow';3435const BLUE = 'phui-box-blue';36const BLUE_PROPERTY = 'phui-box-blue-property';37const WHITE_CONFIG = 'phui-box-white-config';38const GREY = 'phui-box-grey';3940public function addPropertyList(PHUIPropertyListView $property_list) {41$this->propertyLists[] = $property_list;4243$action_list = $property_list->getActionList();44if ($action_list) {45$this->actionListID = celerity_generate_unique_node_id();46$action_list->setId($this->actionListID);47}4849return $this;50}5152public function setHeaderText($text) {53$this->headerText = $text;54return $this;55}5657public function setColor($color) {58$this->color = $color;59return $this;60}6162public function setBackground($color) {63$this->background = $color;64return $this;65}6667public function setFormErrors(array $errors, $title = null) {68if ($errors) {69$this->formErrors = id(new PHUIInfoView())70->setTitle($title)71->setErrors($errors);72}73return $this;74}7576public function addTabGroup(PHUITabGroupView $view) {77$this->tabGroups[] = $view;78return $this;79}8081public function setInfoView(PHUIInfoView $view) {82$this->infoView = $view;83return $this;84}8586public function setForm($form) {87$this->form = $form;88return $this;89}9091public function setHeader($header) {92$this->header = $header;93return $this;94}9596public function setFlush($flush) {97$this->flush = $flush;98return $this;99}100101public function setObjectList($list) {102$this->objectList = $list;103return $this;104}105106public function setTable($table) {107$this->collapsed = true;108$this->table = $table;109return $this;110}111112public function setCollapsed($collapsed) {113$this->collapsed = $collapsed;114return $this;115}116117public function setPager(PHUIPagerView $pager) {118$this->pager = $pager;119return $this;120}121122public function setAnchor(PhabricatorAnchorView $anchor) {123$this->anchor = $anchor;124return $this;125}126127public function setShowHide($show, $hide, $content, $href, $open = false) {128$this->showAction = $show;129$this->hideAction = $hide;130$this->showHideContent = $content;131$this->showHideHref = $href;132$this->showHideOpen = $open;133return $this;134}135136public function setValidationException(137PhabricatorApplicationTransactionValidationException $ex = null) {138$this->validationException = $ex;139return $this;140}141142public function newTailButton() {143$button = id(new PHUIButtonView())144->setTag('a')145->setColor(PHUIButtonView::GREY);146147$this->tailButtons[] = $button;148149return $button;150}151152protected function getTagAttributes() {153$classes = array();154$classes[] = 'phui-box';155$classes[] = 'phui-box-border';156$classes[] = 'phui-object-box';157$classes[] = 'mlt mll mlr';158159if ($this->color) {160$classes[] = 'phui-object-box-'.$this->color;161}162163if ($this->collapsed) {164$classes[] = 'phui-object-box-collapsed';165}166167if ($this->flush) {168$classes[] = 'phui-object-box-flush';169}170171if ($this->background) {172$classes[] = $this->background;173}174175return array(176'class' => implode(' ', $classes),177);178}179180protected function getTagContent() {181require_celerity_resource('phui-box-css');182require_celerity_resource('phui-object-box-css');183184$header = $this->header;185186if ($this->headerText) {187$header = id(new PHUIHeaderView())188->setHeader($this->headerText);189}190191$showhide = null;192if ($this->showAction !== null) {193if (!$header) {194$header = id(new PHUIHeaderView());195}196197Javelin::initBehavior('phabricator-reveal-content');198199$hide_action_id = celerity_generate_unique_node_id();200$show_action_id = celerity_generate_unique_node_id();201$content_id = celerity_generate_unique_node_id();202203$hide_style = ($this->showHideOpen ? 'display: none;': null);204$show_style = ($this->showHideOpen ? null : 'display: none;');205$hide_action = id(new PHUIButtonView())206->setTag('a')207->addSigil('reveal-content')208->setID($hide_action_id)209->setStyle($hide_style)210->setIcon('fa-search')211->setHref($this->showHideHref)212->setMetaData(213array(214'hideIDs' => array($hide_action_id),215'showIDs' => array($content_id, $show_action_id),216))217->setText($this->showAction);218219$show_action = id(new PHUIButtonView())220->setTag('a')221->addSigil('reveal-content')222->setStyle($show_style)223->setIcon('fa-search')224->setHref('#')225->setID($show_action_id)226->setMetaData(227array(228'hideIDs' => array($content_id, $show_action_id),229'showIDs' => array($hide_action_id),230))231->setText($this->hideAction);232233$header->addActionLink($hide_action);234$header->addActionLink($show_action);235236$showhide = array(237phutil_tag(238'div',239array(240'class' => 'phui-object-box-hidden-content',241'id' => $content_id,242'style' => $show_style,243),244$this->showHideContent),245);246}247248249if ($this->actionListID) {250$icon_id = celerity_generate_unique_node_id();251$icon = id(new PHUIIconView())252->setIcon('fa-bars');253$meta = array(254'map' => array(255$this->actionListID => 'phabricator-action-list-toggle',256$icon_id => 'phuix-dropdown-open',257),258);259$mobile_menu = id(new PHUIButtonView())260->setTag('a')261->setText(pht('Actions'))262->setHref('#')263->setIcon($icon)264->addClass('phui-mobile-menu')265->setID($icon_id)266->addSigil('jx-toggle-class')267->setMetadata($meta);268$header->addActionLink($mobile_menu);269}270271$ex = $this->validationException;272$exception_errors = null;273if ($ex) {274$messages = array();275foreach ($ex->getErrors() as $error) {276$messages[] = $error->getMessage();277}278if ($messages) {279$exception_errors = id(new PHUIInfoView())280->setErrors($messages);281}282}283284if ($this->propertyLists) {285$lists = new PHUIPropertyGroupView();286287$ii = 0;288foreach ($this->propertyLists as $list) {289if ($ii > 0 || $this->tabGroups) {290$list->addClass('phui-property-list-section-noninitial');291}292293$lists->addPropertyList($list);294$ii++;295}296} else {297$lists = null;298}299300$pager = null;301if ($this->pager) {302if ($this->pager->willShowPagingControls()) {303$pager = phutil_tag_div('phui-object-box-pager', $this->pager);304}305}306307$content = array(308($this->showHideOpen == false ? $this->anchor : null),309$header,310$this->infoView,311$this->formErrors,312$exception_errors,313$this->form,314$this->tabGroups,315$showhide,316($this->showHideOpen == true ? $this->anchor : null),317$lists,318$this->table,319$pager,320$this->renderChildren(),321);322323if ($this->objectList) {324$content[] = $this->objectList;325}326327if ($this->tailButtons) {328$content[] = phutil_tag(329'div',330array(331'class' => 'phui-object-box-tail-buttons',332),333$this->tailButtons);334}335336return $content;337}338}339340341