Find this useful? Enter your email to receive occasional updates for securing PHP code.

Signing you up...

Thank you for signing up!

PHP Decode

<?php abstract class PhabricatorProfileMenuEngine extends Phobject { private $viewer; pri..

Decoded Output download

<?php
 abstract class PhabricatorProfileMenuEngine extends Phobject { private $viewer; private $profileObject; private $customPHID; private $items; private $controller; private $navigation; private $editMode; private $pageClasses = array(); private $showContentCrumbs = true; const ITEM_CUSTOM_DIVIDER = "engine.divider"; const ITEM_MANAGE = "item.configure"; const MODE_COMBINED = "combined"; const MODE_GLOBAL = "global"; const MODE_CUSTOM = "custom"; public function setViewer(PhabricatorUser $viewer) { $this->viewer = $viewer; return $this; } public function getViewer() { return $this->viewer; } public function setProfileObject($profile_object) { $this->profileObject = $profile_object; return $this; } public function getProfileObject() { return $this->profileObject; } public function setCustomPHID($custom_phid) { $this->customPHID = $custom_phid; return $this; } public function getCustomPHID() { return $this->customPHID; } private function getEditModeCustomPHID() { $mode = $this->getEditMode(); switch ($mode) { case self::MODE_CUSTOM: $custom_phid = $this->getCustomPHID(); break; case self::MODE_GLOBAL: $custom_phid = null; break; } return $custom_phid; } public function setController(PhabricatorController $controller) { $this->controller = $controller; return $this; } public function getController() { return $this->controller; } public function addContentPageClass($class) { $this->pageClasses[] = $class; return $this; } public function setShowContentCrumbs($show_content_crumbs) { $this->showContentCrumbs = $show_content_crumbs; return $this; } public function getShowContentCrumbs() { return $this->showContentCrumbs; } public abstract function getItemURI($path); protected abstract function isMenuEngineConfigurable(); protected abstract function getBuiltinProfileItems($object); protected function getBuiltinCustomProfileItems($object, $custom_phid) { return array(); } protected function getEditMode() { return $this->editMode; } public function buildResponse() { $controller = $this->getController(); $viewer = $controller->getViewer(); $this->setViewer($viewer); $request = $controller->getRequest(); $item_action = $request->getURIData("itemAction"); if (!$item_action) { $item_action = "view"; } $is_view = $item_action == "view"; if (!$this->isMenuEngineConfigurable()) { if (!$is_view) { return new Aphront404Response(); } } $item_id = $request->getURIData("itemID"); if (!$item_id) { $item_id = $request->getURIData("id"); } $view_list = $this->newProfileMenuItemViewList(); if ($is_view) { $selected_item = $this->selectViewItem($view_list, $item_id); } else { if ($item_id === null || !strlen($item_id)) { $item_id = self::ITEM_MANAGE; } $selected_item = $this->selectEditItem($view_list, $item_id); } switch ($item_action) { case "view": break; case "info": case "hide": case "default": case "builtin": if (!$selected_item) { return new Aphront404Response(); } break; case "edit": if (!$request->getURIData("id")) { return new Aphront404Response(); } break; } $navigation = $view_list->newNavigationView(); $crumbs = $controller->buildApplicationCrumbsForEditEngine(); if (!$is_view) { $edit_mode = null; if ($selected_item) { if ($selected_item->getBuiltinKey() !== self::ITEM_MANAGE) { if ($selected_item->getCustomPHID()) { $edit_mode = "custom"; } else { $edit_mode = "global"; } } } if ($edit_mode === null) { $edit_mode = $request->getURIData("itemEditMode"); } $available_modes = $this->getViewerEditModes(); if ($available_modes) { $available_modes = array_fuse($available_modes); if (isset($available_modes[$edit_mode])) { $this->editMode = $edit_mode; } else { if ($item_action != "configure") { return new Aphront404Response(); } } } $page_title = pht("Configure Menu"); } else { if ($selected_item) { $page_title = $selected_item->getDisplayName(); } else { $page_title = pht("Empty"); } } switch ($item_action) { case "view": if ($selected_item) { try { $content = $this->buildItemViewContent($selected_item); } catch (Exception $ex) { $content = id(new PHUIInfoView())->setTitle(pht("Unable to Render Dashboard"))->setErrors(array($ex->getMessage())); } $crumbs->addTextCrumb($selected_item->getDisplayName()); } else { $content = $this->newNoContentView($this->getItems()); } if (!$content) { $content = $this->newEmptyView(pht("Empty"), pht("There is nothing here.")); } break; case "configure": $mode = $this->getEditMode(); if (!$mode) { $crumbs->addTextCrumb(pht("Configure Menu")); $content = $this->buildMenuEditModeContent(); } else { if (count($available_modes) > 1) { $crumbs->addTextCrumb(pht("Configure Menu"), $this->getItemURI("configure/")); switch ($mode) { case self::MODE_CUSTOM: $crumbs->addTextCrumb(pht("Personal")); break; case self::MODE_GLOBAL: $crumbs->addTextCrumb(pht("Global")); break; } } else { $crumbs->addTextCrumb(pht("Configure Menu")); } $edit_list = $this->loadItems($mode); $content = $this->buildItemConfigureContent($edit_list); } break; case "reorder": $mode = $this->getEditMode(); $edit_list = $this->loadItems($mode); $content = $this->buildItemReorderContent($edit_list); break; case "new": $item_key = $request->getURIData("itemKey"); $mode = $this->getEditMode(); $content = $this->buildItemNewContent($item_key, $mode); break; case "builtin": $content = $this->buildItemBuiltinContent($selected_item); break; case "hide": $content = $this->buildItemHideContent($selected_item); break; case "default": if (!$this->isMenuEnginePinnable()) { return new Aphront404Response(); } $content = $this->buildItemDefaultContent($selected_item); break; case "edit": $content = $this->buildItemEditContent(); break; default: throw new Exception(pht("Unsupported item action "%s".", $item_action)); } if ($content instanceof AphrontResponse) { return $content; } if ($content instanceof AphrontResponseProducerInterface) { return $content; } $crumbs->setBorder(true); $page = $controller->newPage()->setTitle($page_title)->appendChild($content); if (!$is_view || $this->getShowContentCrumbs()) { $page->setCrumbs($crumbs); } $page->setNavigation($navigation); if ($is_view) { foreach ($this->pageClasses as $class) { $page->addClass($class); } } return $page; } private function getItems() { if ($this->items === null) { $this->items = $this->loadItems(self::MODE_COMBINED); } return $this->items; } private function loadItems($mode) { $viewer = $this->getViewer(); $object = $this->getProfileObject(); $items = $this->loadBuiltinProfileItems($mode); $query = id(new PhabricatorProfileMenuItemConfigurationQuery())->setViewer($viewer)->withProfilePHIDs(array($object->getPHID())); switch ($mode) { case self::MODE_GLOBAL: $query->withCustomPHIDs(array(), true); break; case self::MODE_CUSTOM: $query->withCustomPHIDs(array($this->getCustomPHID()), false); break; case self::MODE_COMBINED: $query->withCustomPHIDs(array($this->getCustomPHID()), true); break; } $stored_items = $query->execute(); foreach ($stored_items as $stored_item) { $impl = $stored_item->getMenuItem(); $impl->setViewer($viewer); $impl->setEngine($this); } foreach ($stored_items as $stored_item) { if (!$stored_item->shouldEnableForObject($object)) { continue; } $builtin_key = $stored_item->getBuiltinKey(); if ($builtin_key !== null) { if (isset($items[$builtin_key])) { $builtin_item = $items[$builtin_key]; $stored_item->setIsHeadItem($builtin_item->getIsHeadItem()); $stored_item->setIsTailItem($builtin_item->getIsTailItem()); $items[$builtin_key] = $stored_item; } else { continue; } } else { $items[] = $stored_item; } } return $this->arrangeItems($items, $mode); } private function loadBuiltinProfileItems($mode) { $object = $this->getProfileObject(); switch ($mode) { case self::MODE_GLOBAL: $builtins = $this->getBuiltinProfileItems($object); break; case self::MODE_CUSTOM: $builtins = $this->getBuiltinCustomProfileItems($object, $this->getCustomPHID()); break; case self::MODE_COMBINED: $builtins = array(); $builtins[] = $this->getBuiltinCustomProfileItems($object, $this->getCustomPHID()); $builtins[] = $this->getBuiltinProfileItems($object); $builtins = array_mergev($builtins); break; } $items = PhabricatorProfileMenuItem::getAllMenuItems(); $viewer = $this->getViewer(); $order = 1; $map = array(); foreach ($builtins as $builtin) { $builtin_key = $builtin->getBuiltinKey(); if (!$builtin_key) { throw new Exception(pht("Object produced a builtin item with no builtin item key! " . "Builtin items must have a unique key.")); } if (isset($map[$builtin_key])) { throw new Exception(pht("Object produced two items with the same builtin key ("%s"). " . "Each item must have a unique builtin key.", $builtin_key)); } $item_key = $builtin->getMenuItemKey(); $item = idx($items, $item_key); if (!$item) { throw new Exception(pht("Builtin item ("%s") specifies a bad item key ("%s"); there " . "is no corresponding item implementation available.", $builtin_key, $item_key)); } $item = clone $item; $item->setViewer($viewer); $item->setEngine($this); $builtin->setProfilePHID($object->getPHID())->attachMenuItem($item)->attachProfileObject($object)->setMenuItemOrder($order); if (!$builtin->shouldEnableForObject($object)) { continue; } $map[$builtin_key] = $builtin; $order++; } return $map; } private function validateNavigationMenuItem($item) { if (!$item instanceof PHUIListItemView) { throw new Exception(pht("Expected buildNavigationMenuItems() to return a list of " . "PHUIListItemView objects, but got a surprise.")); } } public function getConfigureURI() { $mode = $this->getEditMode(); switch ($mode) { case self::MODE_CUSTOM: return $this->getItemURI("configure/custom/"); case self::MODE_GLOBAL: return $this->getItemURI("configure/global/"); } return $this->getItemURI("configure/"); } private function buildItemReorderContent(array $items) { $viewer = $this->getViewer(); $object = $this->getProfileObject(); $custom_phid = $this->getEditModeCustomPHID(); if (!$custom_phid) { PhabricatorPolicyFilter::requireCapability($viewer, $object, PhabricatorPolicyCapability::CAN_EDIT); } else { $policy_object = id(new PhabricatorObjectQuery())->setViewer($viewer)->withPHIDs(array($custom_phid))->executeOne(); if (!$policy_object) { throw new Exception(pht("Failed to load custom PHID "%s"!", $custom_phid)); } PhabricatorPolicyFilter::requireCapability($viewer, $policy_object, PhabricatorPolicyCapability::CAN_EDIT); } $controller = $this->getController(); $request = $controller->getRequest(); $request->validateCSRF(); $order = $request->getStrList("order"); $by_builtin = array(); $by_id = array(); foreach ($items as $key => $item) { $id = $item->getID(); if ($id) { $by_id[$id] = $key; continue; } $builtin_key = $item->getBuiltinKey(); if ($builtin_key) { $by_builtin[$builtin_key] = $key; continue; } } $key_order = array(); foreach ($order as $order_item) { if (isset($by_id[$order_item])) { $key_order[] = $by_id[$order_item]; continue; } if (isset($by_builtin[$order_item])) { $key_order[] = $by_builtin[$order_item]; continue; } } $items = array_select_keys($items, $key_order) + $items; $type_order = PhabricatorProfileMenuItemConfigurationTransaction::TYPE_ORDER; $order = 1; foreach ($items as $item) { $xactions = array(); $xactions[] = id(new PhabricatorProfileMenuItemConfigurationTransaction())->setTransactionType($type_order)->setNewValue($order); $editor = id(new PhabricatorProfileMenuEditor())->setContentSourceFromRequest($request)->setActor($viewer)->setContinueOnMissingFields(true)->setContinueOnNoEffect(true)->applyTransactions($item, $xactions); $order++; } return id(new AphrontRedirectResponse())->setURI($this->getConfigureURI()); } protected function buildItemViewContent(PhabricatorProfileMenuItemConfiguration $item) { return $item->newPageContent(); } private function getViewerEditModes() { $modes = array(); $viewer = $this->getViewer(); if ($viewer->isLoggedIn() && $this->isMenuEnginePersonalizable()) { $modes[] = self::MODE_CUSTOM; } $object = $this->getProfileObject(); $can_edit = PhabricatorPolicyFilter::hasCapability($viewer, $object, PhabricatorPolicyCapability::CAN_EDIT); if ($can_edit) { $modes[] = self::MODE_GLOBAL; } return $modes; } protected function isMenuEnginePersonalizable() { return true; } public function isMenuEnginePinnable() { return !$this->isMenuEnginePersonalizable(); } private function buildMenuEditModeContent() { $viewer = $this->getViewer(); $modes = $this->getViewerEditModes(); if (!$modes) { return new Aphront404Response(); } if (count($modes) == 1) { $mode = head($modes); return id(new AphrontRedirectResponse())->setURI($this->getItemURI("configure/{$mode}/")); } $menu = id(new PHUIObjectItemListView())->setUser($viewer); $modes = array_fuse($modes); if (isset($modes["custom"])) { $menu->addItem(id(new PHUIObjectItemView())->setHeader(pht("Personal Menu Items"))->setHref($this->getItemURI("configure/custom/"))->setImageURI($viewer->getProfileImageURI())->addAttribute(pht("Edit the menu for your personal account."))); } if (isset($modes["global"])) { $icon = id(new PHUIIconView())->setIcon("fa-globe")->setBackground("bg-blue"); $menu->addItem(id(new PHUIObjectItemView())->setHeader(pht("Global Menu Items"))->setHref($this->getItemURI("configure/global/"))->setImageIcon($icon)->addAttribute(pht("Edit the global default menu for all users."))); } $box = id(new PHUIObjectBoxView())->setObjectList($menu); $header = id(new PHUIHeaderView())->setHeader(pht("Manage Menu"))->setHeaderIcon("fa-list"); return id(new PHUITwoColumnView())->setHeader($header)->setFooter($box); } private function buildItemConfigureContent(array $items) { $viewer = $this->getViewer(); $object = $this->getProfileObject(); $filtered_groups = mgroup($items, "getMenuItemKey"); foreach ($filtered_groups as $group) { $first_item = head($group); $first_item->willGetMenuItemViewList($group); } if (!$this->getCustomPHID()) { PhabricatorPolicyFilter::requireCapability($viewer, $object, PhabricatorPolicyCapability::CAN_EDIT); } $list_id = celerity_generate_unique_node_id(); $mode = $this->getEditMode(); Javelin::initBehavior("reorder-profile-menu-items", array("listID" => $list_id, "orderURI" => $this->getItemURI("reorder/{$mode}/"))); $list = id(new PHUIObjectItemListView())->setID($list_id)->setNoDataString(pht("This menu currently has no items.")); $any_draggable = false; foreach ($items as $item) { $id = $item->getID(); $builtin_key = $item->getBuiltinKey(); $can_edit = PhabricatorPolicyFilter::hasCapability($viewer, $item, PhabricatorPolicyCapability::CAN_EDIT); $view = id(new PHUIObjectItemView()); $name = $item->getDisplayName(); $type = $item->getMenuItemTypeName(); if (!strlen(trim($name))) { $name = pht("Untitled "%s" Item", $type); } $view->setHeader($name); $view->addAttribute($type); $icon = $item->getMenuItem()->getMenuItemTypeIcon(); if ($icon !== null) { $view->setStatusIcon($icon); } if ($can_edit) { $can_move = !$item->getIsHeadItem() && !$item->getIsTailItem(); if ($can_move) { $view->setGrippable(true)->addSigil("profile-menu-item")->setMetadata(array("key" => nonempty($id, $builtin_key))); $any_draggable = true; } else { $view->setGrippable(false); } if ($id) { $default_uri = $this->getItemURI("default/{$id}/"); } else { $default_uri = $this->getItemURI("default/{$builtin_key}/"); } $default_text = null; if ($this->isMenuEnginePinnable()) { if ($item->isDefault()) { $default_icon = "fa-thumb-tack green"; $default_text = pht("Current Default"); } else { if ($item->canMakeDefault()) { $default_icon = "fa-thumb-tack"; $default_text = pht("Make Default"); } } } if ($default_text !== null) { $view->addAction(id(new PHUIListItemView())->setHref($default_uri)->setWorkflow(true)->setName($default_text)->setIcon($default_icon)); } if ($id) { $view->setHref($this->getItemURI("edit/{$id}/")); $hide_uri = $this->getItemURI("hide/{$id}/"); } else { $view->setHref($this->getItemURI("builtin/{$builtin_key}/")); $hide_uri = $this->getItemURI("hide/{$builtin_key}/"); } if ($item->isDisabled()) { $hide_icon = "fa-plus"; $hide_text = pht("Enable"); } else { if ($item->getBuiltinKey() !== null) { $hide_icon = "fa-times"; $hide_text = pht("Disable"); } else { $hide_icon = "fa-times"; $hide_text = pht("Delete"); } } $can_disable = $item->canHideMenuItem(); $view->addAction(id(new PHUIListItemView())->setHref($hide_uri)->setWorkflow(true)->setDisabled(!$can_disable)->setName($hide_text)->setIcon($hide_icon)); } if ($item->isDisabled()) { $view->setDisabled(true); } $list->addItem($view); } $item_types = PhabricatorProfileMenuItem::getAllMenuItems(); $object = $this->getProfileObject(); $action_list = id(new PhabricatorActionListView())->setViewer($viewer); $action_list->setID(celerity_generate_unique_node_id()); $action_list->addAction(id(new PhabricatorActionView())->setLabel(true)->setName(pht("Add New Menu Item..."))); foreach ($item_types as $item_type) { if (!$item_type->canAddToObject($object)) { continue; } $item_key = $item_type->getMenuItemKey(); $edit_mode = $this->getEditMode(); $action_list->addAction(id(new PhabricatorActionView())->setIcon($item_type->getMenuItemTypeIcon())->setName($item_type->getMenuItemTypeName())->setHref($this->getItemURI("new/{$edit_mode}/{$item_key}/"))->setWorkflow(true)); } $action_list->addAction(id(new PhabricatorActionView())->setLabel(true)->setName(pht("Documentation"))); $doc_link = PhabricatorEnv::getDoclink("Profile Menu User Guide"); $doc_name = pht("Profile Menu User Guide"); $action_list->addAction(id(new PhabricatorActionView())->setIcon("fa-book")->setHref($doc_link)->setName($doc_name)); $header = id(new PHUIHeaderView())->setHeader(pht("Menu Items"))->setHeaderIcon("fa-list"); $list_header = id(new PHUIHeaderView())->setHeader(pht("Current Menu Items")); if ($any_draggable) { $list_header->setSubheader(pht("Drag items in this list to reorder them.")); } $box = id(new PHUIObjectBoxView())->setHeader($list_header)->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)->setObjectList($list); $curtain = id(new PHUICurtainView())->setViewer($viewer)->setActionList($action_list); $view = id(new PHUITwoColumnView())->setHeader($header)->setCurtain($curtain)->setMainColumn(array($box)); return $view; } private function buildItemNewContent($item_key, $mode) { $item_types = PhabricatorProfileMenuItem::getAllMenuItems(); $item_type = idx($item_types, $item_key); if (!$item_type) { return new Aphront404Response(); } $object = $this->getProfileObject(); if (!$item_type->canAddToObject($object)) { return new Aphront404Response(); } $custom_phid = $this->getEditModeCustomPHID(); $configuration = PhabricatorProfileMenuItemConfiguration::initializeNewItem($object, $item_type, $custom_phid); $viewer = $this->getViewer(); PhabricatorPolicyFilter::requireCapability($viewer, $configuration, PhabricatorPolicyCapability::CAN_EDIT); $controller = $this->getController(); return id(new PhabricatorProfileMenuEditEngine())->setMenuEngine($this)->setProfileObject($object)->setNewMenuItemConfiguration($configuration)->setCustomPHID($custom_phid)->setController($controller)->buildResponse(); } private function buildItemEditContent() { $viewer = $this->getViewer(); $object = $this->getProfileObject(); $controller = $this->getController(); $custom_phid = $this->getEditModeCustomPHID(); return id(new PhabricatorProfileMenuEditEngine())->setMenuEngine($this)->setProfileObject($object)->setController($controller)->setCustomPHID($custom_phid)->buildResponse(); } private function buildItemBuiltinContent(PhabricatorProfileMenuItemConfiguration $configuration) { $id = $configuration->getID(); if ($id) { return id(new AphrontRedirectResponse())->setURI($this->getItemURI("edit/{$id}/")); } $viewer = $this->getViewer(); PhabricatorPolicyFilter::requireCapability($viewer, $configuration, PhabricatorPolicyCapability::CAN_EDIT); $object = $this->getProfileObject(); $controller = $this->getController(); $custom_phid = $this->getEditModeCustomPHID(); return id(new PhabricatorProfileMenuEditEngine())->setIsBuiltin(true)->setMenuEngine($this)->setProfileObject($object)->setNewMenuItemConfiguration($configuration)->setController($controller)->setCustomPHID($custom_phid)->buildResponse(); } private function buildItemHideContent(PhabricatorProfileMenuItemConfiguration $configuration) { $controller = $this->getController(); $request = $controller->getRequest(); $viewer = $this->getViewer(); PhabricatorPolicyFilter::requireCapability($viewer, $configuration, PhabricatorPolicyCapability::CAN_EDIT); if (!$configuration->canHideMenuItem()) { return $controller->newDialog()->setTitle(pht("Mandatory Item"))->appendParagraph(pht("This menu item is very important, and can not be disabled."))->addCancelButton($this->getConfigureURI()); } if ($configuration->getBuiltinKey() === null) { $new_value = null; $title = pht("Delete Menu Item"); $body = pht("Delete this menu item?"); $button = pht("Delete Menu Item"); } else { if ($configuration->isDisabled()) { $new_value = PhabricatorProfileMenuItemConfiguration::VISIBILITY_VISIBLE; $title = pht("Enable Menu Item"); $body = pht("Enable this menu item? It will appear in the menu again."); $button = pht("Enable Menu Item"); } else { $new_value = PhabricatorProfileMenuItemConfiguration::VISIBILITY_DISABLED; $title = pht("Disable Menu Item"); $body = pht("Disable this menu item? It will no longer appear in the menu, but " . "you can re-enable it later."); $button = pht("Disable Menu Item"); } } $v_visibility = $configuration->getVisibility(); if ($request->isFormPost()) { if ($new_value === null) { $configuration->delete(); } else { $type_visibility = PhabricatorProfileMenuItemConfigurationTransaction::TYPE_VISIBILITY; $xactions = array(); $xactions[] = id(new PhabricatorProfileMenuItemConfigurationTransaction())->setTransactionType($type_visibility)->setNewValue($new_value); $editor = id(new PhabricatorProfileMenuEditor())->setContentSourceFromRequest($request)->setActor($viewer)->setContinueOnMissingFields(true)->setContinueOnNoEffect(true)->applyTransactions($configuration, $xactions); } return id(new AphrontRedirectResponse())->setURI($this->getConfigureURI()); } return $controller->newDialog()->setTitle($title)->appendParagraph($body)->addCancelButton($this->getConfigureURI())->addSubmitButton($button); } private function buildItemDefaultContent(PhabricatorProfileMenuItemConfiguration $configuration) { $controller = $this->getController(); $request = $controller->getRequest(); $viewer = $this->getViewer(); PhabricatorPolicyFilter::requireCapability($viewer, $configuration, PhabricatorPolicyCapability::CAN_EDIT); $done_uri = $this->getConfigureURI(); if (!$configuration->canMakeDefault()) { return $controller->newDialog()->setTitle(pht("Not Defaultable"))->appendParagraph(pht("This item can not be set as the default item. This is usually " . "because the item has no page of its own, or links to an " . "external page."))->addCancelButton($done_uri); } if ($configuration->isDefault()) { return $controller->newDialog()->setTitle(pht("Already Default"))->appendParagraph(pht("This item is already set as the default item for this menu."))->addCancelButton($done_uri); } if ($request->isFormPost()) { $key = $configuration->getID(); if (!$key) { $key = $configuration->getBuiltinKey(); } $this->adjustDefault($key); return id(new AphrontRedirectResponse())->setURI($done_uri); } return $controller->newDialog()->setTitle(pht("Make Default"))->appendParagraph(pht("Set this item as the default for this menu? Users arriving on " . "this page will be shown the content of this item by default."))->addCancelButton($done_uri)->addSubmitButton(pht("Make Default")); } protected function newItem() { return PhabricatorProfileMenuItemConfiguration::initializeNewBuiltin(); } protected function newManageItem() { return $this->newItem()->setBuiltinKey(self::ITEM_MANAGE)->setMenuItemKey(PhabricatorManageProfileMenuItem::MENUITEMKEY)->setIsTailItem(true); } protected function newDividerItem($key) { return $this->newItem()->setBuiltinKey($key)->setMenuItemKey(PhabricatorDividerProfileMenuItem::MENUITEMKEY)->setIsTailItem(true); } public function getDefaultMenuItemConfiguration() { $configs = $this->getItems(); foreach ($configs as $config) { if ($config->isDefault()) { return $config; } } return null; } public function adjustDefault($key) { $controller = $this->getController(); $request = $controller->getRequest(); $viewer = $request->getViewer(); $items = $this->loadItems(self::MODE_COMBINED); $default = array(); $visible = array(); foreach ($items as $item) { $builtin_key = $item->getBuiltinKey(); $id = $item->getID(); $is_target = $builtin_key !== null && $builtin_key === $key || $id !== null && (int) $id === (int) $key; if ($is_target) { if (!$item->isDefault()) { $default[] = $item; } } else { if ($item->isDefault()) { $visible[] = $item; } } } $type_visibility = PhabricatorProfileMenuItemConfigurationTransaction::TYPE_VISIBILITY; $v_visible = PhabricatorProfileMenuItemConfiguration::VISIBILITY_VISIBLE; $v_default = PhabricatorProfileMenuItemConfiguration::VISIBILITY_DEFAULT; $apply = array(array($v_visible, $visible), array($v_default, $default)); foreach ($apply as $group) { list($value, $items) = $group; foreach ($items as $item) { $xactions = array(); $xactions[] = id(new PhabricatorProfileMenuItemConfigurationTransaction())->setTransactionType($type_visibility)->setNewValue($value); $editor = id(new PhabricatorProfileMenuEditor())->setContentSourceFromRequest($request)->setActor($viewer)->setContinueOnMissingFields(true)->setContinueOnNoEffect(true)->applyTransactions($item, $xactions); } } return $this; } private function arrangeItems(array $items, $mode) { $items = msortv($items, "getSortVector"); $object = $this->getProfileObject(); if ($mode == self::MODE_COMBINED) { $list = array(); $seen_custom = false; $seen_global = false; foreach ($items as $item) { if ($item->getCustomPHID()) { $seen_custom = true; } else { if ($seen_custom && !$seen_global) { $list[] = $this->newItem()->setBuiltinKey(self::ITEM_CUSTOM_DIVIDER)->setMenuItemKey(PhabricatorDividerProfileMenuItem::MENUITEMKEY)->attachProfileObject($object)->attachMenuItem(new PhabricatorDividerProfileMenuItem()); } $seen_global = true; } $list[] = $item; } $items = $list; } $items = array_values($items); return $items; } protected final function newEmptyView($title, $message) { return id(new PHUIInfoView())->setTitle($title)->setSeverity(PHUIInfoView::SEVERITY_NODATA)->setErrors(array($message)); } protected function newNoContentView(array $items) { return $this->newEmptyView(pht("No Content"), pht("No visible menu items can render content.")); } public final function newProfileMenuItemViewList() { $items = $this->getItems(); foreach ($items as $key => $item) { if ($item->isDisabled()) { unset($items[$key]); continue; } } $groups = mgroup($items, "getMenuItemKey"); foreach ($groups as $group) { $item = head($group); $item->willGetMenuItemViewList($group); } $view_list = id(new PhabricatorProfileMenuItemViewList())->setProfileMenuEngine($this); foreach ($items as $item) { $views = $item->getMenuItemViewList(); foreach ($views as $view) { $view_list->addItemView($view); } } return $view_list; } private function selectViewItem(PhabricatorProfileMenuItemViewList $view_list, $item_id) { $selected_view = null; if ($item_id !== null && strlen($item_id)) { $item_views = $view_list->getViewsWithItemIdentifier($item_id); if ($item_views) { $selected_view = head($item_views); } } else { $default_views = $view_list->getDefaultViews(); if ($default_views) { $selected_view = head($default_views); } } if ($selected_view) { $view_list->setSelectedView($selected_view); $selected_item = $selected_view->getMenuItemConfiguration(); } else { $selected_item = null; } return $selected_item; } private function selectEditItem(PhabricatorProfileMenuItemViewList $view_list, $item_id) { if ($item_id) { $selected_item = $this->selectViewItem($view_list, $item_id); if ($selected_item) { return $selected_item; } } foreach ($this->getItems() as $item) { if ($item->matchesIdentifier($item_id)) { return $item; } } return null; } } ?>

Did this file decode correctly?

Original Code

<?php
 abstract class PhabricatorProfileMenuEngine extends Phobject { private $viewer; private $profileObject; private $customPHID; private $items; private $controller; private $navigation; private $editMode; private $pageClasses = array(); private $showContentCrumbs = true; const ITEM_CUSTOM_DIVIDER = "\145\x6e\x67\151\x6e\145\x2e\x64\151\x76\x69\144\x65\x72"; const ITEM_MANAGE = "\151\164\x65\x6d\x2e\x63\157\x6e\x66\151\x67\x75\162\145"; const MODE_COMBINED = "\x63\x6f\155\142\x69\x6e\145\x64"; const MODE_GLOBAL = "\x67\x6c\x6f\142\141\154"; const MODE_CUSTOM = "\143\x75\x73\x74\157\x6d"; public function setViewer(PhabricatorUser $viewer) { $this->viewer = $viewer; return $this; } public function getViewer() { return $this->viewer; } public function setProfileObject($profile_object) { $this->profileObject = $profile_object; return $this; } public function getProfileObject() { return $this->profileObject; } public function setCustomPHID($custom_phid) { $this->customPHID = $custom_phid; return $this; } public function getCustomPHID() { return $this->customPHID; } private function getEditModeCustomPHID() { $mode = $this->getEditMode(); switch ($mode) { case self::MODE_CUSTOM: $custom_phid = $this->getCustomPHID(); break; case self::MODE_GLOBAL: $custom_phid = null; break; } return $custom_phid; } public function setController(PhabricatorController $controller) { $this->controller = $controller; return $this; } public function getController() { return $this->controller; } public function addContentPageClass($class) { $this->pageClasses[] = $class; return $this; } public function setShowContentCrumbs($show_content_crumbs) { $this->showContentCrumbs = $show_content_crumbs; return $this; } public function getShowContentCrumbs() { return $this->showContentCrumbs; } public abstract function getItemURI($path); protected abstract function isMenuEngineConfigurable(); protected abstract function getBuiltinProfileItems($object); protected function getBuiltinCustomProfileItems($object, $custom_phid) { return array(); } protected function getEditMode() { return $this->editMode; } public function buildResponse() { $controller = $this->getController(); $viewer = $controller->getViewer(); $this->setViewer($viewer); $request = $controller->getRequest(); $item_action = $request->getURIData("\x69\164\x65\155\101\x63\x74\x69\157\x6e"); if (!$item_action) { $item_action = "\166\x69\x65\x77"; } $is_view = $item_action == "\x76\x69\x65\167"; if (!$this->isMenuEngineConfigurable()) { if (!$is_view) { return new Aphront404Response(); } } $item_id = $request->getURIData("\151\x74\145\155\x49\104"); if (!$item_id) { $item_id = $request->getURIData("\151\144"); } $view_list = $this->newProfileMenuItemViewList(); if ($is_view) { $selected_item = $this->selectViewItem($view_list, $item_id); } else { if ($item_id === null || !strlen($item_id)) { $item_id = self::ITEM_MANAGE; } $selected_item = $this->selectEditItem($view_list, $item_id); } switch ($item_action) { case "\x76\x69\145\x77": break; case "\x69\156\x66\x6f": case "\x68\x69\144\x65": case "\x64\145\146\141\x75\154\164": case "\x62\x75\151\x6c\x74\x69\156": if (!$selected_item) { return new Aphront404Response(); } break; case "\x65\144\x69\164": if (!$request->getURIData("\x69\x64")) { return new Aphront404Response(); } break; } $navigation = $view_list->newNavigationView(); $crumbs = $controller->buildApplicationCrumbsForEditEngine(); if (!$is_view) { $edit_mode = null; if ($selected_item) { if ($selected_item->getBuiltinKey() !== self::ITEM_MANAGE) { if ($selected_item->getCustomPHID()) { $edit_mode = "\x63\x75\x73\164\157\155"; } else { $edit_mode = "\x67\x6c\157\142\x61\x6c"; } } } if ($edit_mode === null) { $edit_mode = $request->getURIData("\x69\x74\145\155\105\144\x69\164\115\x6f\x64\145"); } $available_modes = $this->getViewerEditModes(); if ($available_modes) { $available_modes = array_fuse($available_modes); if (isset($available_modes[$edit_mode])) { $this->editMode = $edit_mode; } else { if ($item_action != "\x63\x6f\x6e\x66\x69\x67\165\162\x65") { return new Aphront404Response(); } } } $page_title = pht("\103\157\x6e\146\x69\x67\x75\x72\145\x20\x4d\145\x6e\165"); } else { if ($selected_item) { $page_title = $selected_item->getDisplayName(); } else { $page_title = pht("\x45\155\x70\x74\171"); } } switch ($item_action) { case "\166\151\145\x77": if ($selected_item) { try { $content = $this->buildItemViewContent($selected_item); } catch (Exception $ex) { $content = id(new PHUIInfoView())->setTitle(pht("\125\156\141\x62\x6c\145\x20\x74\157\x20\x52\x65\x6e\x64\145\162\40\104\x61\x73\150\142\x6f\x61\162\144"))->setErrors(array($ex->getMessage())); } $crumbs->addTextCrumb($selected_item->getDisplayName()); } else { $content = $this->newNoContentView($this->getItems()); } if (!$content) { $content = $this->newEmptyView(pht("\105\155\160\164\171"), pht("\x54\x68\145\x72\145\x20\x69\x73\40\156\x6f\164\150\151\156\147\40\150\145\x72\x65\56")); } break; case "\143\x6f\x6e\x66\x69\147\x75\x72\x65": $mode = $this->getEditMode(); if (!$mode) { $crumbs->addTextCrumb(pht("\103\x6f\156\146\151\147\165\x72\x65\x20\x4d\145\156\165")); $content = $this->buildMenuEditModeContent(); } else { if (count($available_modes) > 1) { $crumbs->addTextCrumb(pht("\103\157\x6e\146\x69\x67\x75\x72\x65\x20\115\x65\x6e\x75"), $this->getItemURI("\x63\x6f\156\146\151\147\165\x72\145\57")); switch ($mode) { case self::MODE_CUSTOM: $crumbs->addTextCrumb(pht("\120\x65\162\x73\157\x6e\141\x6c")); break; case self::MODE_GLOBAL: $crumbs->addTextCrumb(pht("\x47\154\157\142\141\x6c")); break; } } else { $crumbs->addTextCrumb(pht("\103\157\156\x66\x69\147\x75\162\145\40\115\145\x6e\165")); } $edit_list = $this->loadItems($mode); $content = $this->buildItemConfigureContent($edit_list); } break; case "\162\145\157\x72\144\x65\162": $mode = $this->getEditMode(); $edit_list = $this->loadItems($mode); $content = $this->buildItemReorderContent($edit_list); break; case "\x6e\x65\x77": $item_key = $request->getURIData("\151\164\145\155\x4b\145\171"); $mode = $this->getEditMode(); $content = $this->buildItemNewContent($item_key, $mode); break; case "\142\165\151\x6c\x74\x69\x6e": $content = $this->buildItemBuiltinContent($selected_item); break; case "\150\x69\144\145": $content = $this->buildItemHideContent($selected_item); break; case "\x64\x65\146\x61\x75\x6c\164": if (!$this->isMenuEnginePinnable()) { return new Aphront404Response(); } $content = $this->buildItemDefaultContent($selected_item); break; case "\x65\144\151\x74": $content = $this->buildItemEditContent(); break; default: throw new Exception(pht("\x55\x6e\x73\x75\x70\x70\x6f\162\164\x65\x64\x20\151\164\x65\155\40\141\143\x74\x69\x6f\x6e\x20\42\x25\x73\x22\56", $item_action)); } if ($content instanceof AphrontResponse) { return $content; } if ($content instanceof AphrontResponseProducerInterface) { return $content; } $crumbs->setBorder(true); $page = $controller->newPage()->setTitle($page_title)->appendChild($content); if (!$is_view || $this->getShowContentCrumbs()) { $page->setCrumbs($crumbs); } $page->setNavigation($navigation); if ($is_view) { foreach ($this->pageClasses as $class) { $page->addClass($class); } } return $page; } private function getItems() { if ($this->items === null) { $this->items = $this->loadItems(self::MODE_COMBINED); } return $this->items; } private function loadItems($mode) { $viewer = $this->getViewer(); $object = $this->getProfileObject(); $items = $this->loadBuiltinProfileItems($mode); $query = id(new PhabricatorProfileMenuItemConfigurationQuery())->setViewer($viewer)->withProfilePHIDs(array($object->getPHID())); switch ($mode) { case self::MODE_GLOBAL: $query->withCustomPHIDs(array(), true); break; case self::MODE_CUSTOM: $query->withCustomPHIDs(array($this->getCustomPHID()), false); break; case self::MODE_COMBINED: $query->withCustomPHIDs(array($this->getCustomPHID()), true); break; } $stored_items = $query->execute(); foreach ($stored_items as $stored_item) { $impl = $stored_item->getMenuItem(); $impl->setViewer($viewer); $impl->setEngine($this); } foreach ($stored_items as $stored_item) { if (!$stored_item->shouldEnableForObject($object)) { continue; } $builtin_key = $stored_item->getBuiltinKey(); if ($builtin_key !== null) { if (isset($items[$builtin_key])) { $builtin_item = $items[$builtin_key]; $stored_item->setIsHeadItem($builtin_item->getIsHeadItem()); $stored_item->setIsTailItem($builtin_item->getIsTailItem()); $items[$builtin_key] = $stored_item; } else { continue; } } else { $items[] = $stored_item; } } return $this->arrangeItems($items, $mode); } private function loadBuiltinProfileItems($mode) { $object = $this->getProfileObject(); switch ($mode) { case self::MODE_GLOBAL: $builtins = $this->getBuiltinProfileItems($object); break; case self::MODE_CUSTOM: $builtins = $this->getBuiltinCustomProfileItems($object, $this->getCustomPHID()); break; case self::MODE_COMBINED: $builtins = array(); $builtins[] = $this->getBuiltinCustomProfileItems($object, $this->getCustomPHID()); $builtins[] = $this->getBuiltinProfileItems($object); $builtins = array_mergev($builtins); break; } $items = PhabricatorProfileMenuItem::getAllMenuItems(); $viewer = $this->getViewer(); $order = 1; $map = array(); foreach ($builtins as $builtin) { $builtin_key = $builtin->getBuiltinKey(); if (!$builtin_key) { throw new Exception(pht("\x4f\142\x6a\145\143\x74\x20\x70\162\x6f\x64\x75\143\x65\144\40\141\x20\142\x75\151\154\x74\x69\x6e\40\x69\164\x65\155\x20\x77\x69\x74\150\x20\156\157\x20\142\x75\x69\x6c\x74\x69\x6e\x20\151\x74\145\155\40\153\x65\x79\41\40" . "\102\x75\x69\x6c\x74\151\x6e\x20\x69\x74\145\155\163\40\x6d\165\163\164\x20\150\141\x76\145\x20\141\40\165\156\x69\x71\165\145\x20\x6b\145\x79\x2e")); } if (isset($map[$builtin_key])) { throw new Exception(pht("\x4f\x62\152\145\143\164\x20\x70\162\x6f\144\x75\x63\145\x64\x20\164\x77\157\40\151\x74\x65\155\x73\x20\x77\x69\x74\x68\40\x74\x68\x65\40\x73\141\155\x65\40\142\165\151\x6c\164\x69\x6e\x20\153\145\x79\x20\50\x22\45\163\42\x29\x2e\x20" . "\x45\x61\x63\150\x20\151\164\x65\155\40\155\165\163\164\40\x68\141\166\145\x20\141\40\x75\156\151\161\165\145\40\142\165\x69\154\x74\x69\156\40\153\x65\171\x2e", $builtin_key)); } $item_key = $builtin->getMenuItemKey(); $item = idx($items, $item_key); if (!$item) { throw new Exception(pht("\x42\165\x69\154\x74\151\x6e\40\x69\164\145\x6d\40\x28\x22\45\163\x22\x29\40\163\160\145\143\x69\146\x69\x65\163\x20\x61\x20\x62\x61\144\x20\x69\x74\145\x6d\x20\x6b\x65\171\x20\x28\x22\x25\x73\x22\x29\x3b\x20\164\x68\145\x72\145\40" . "\x69\x73\x20\156\x6f\x20\x63\x6f\162\162\x65\163\x70\157\156\144\x69\x6e\x67\40\x69\164\x65\155\x20\x69\155\x70\x6c\145\155\145\x6e\x74\x61\x74\x69\157\x6e\40\x61\x76\x61\151\154\141\x62\x6c\x65\56", $builtin_key, $item_key)); } $item = clone $item; $item->setViewer($viewer); $item->setEngine($this); $builtin->setProfilePHID($object->getPHID())->attachMenuItem($item)->attachProfileObject($object)->setMenuItemOrder($order); if (!$builtin->shouldEnableForObject($object)) { continue; } $map[$builtin_key] = $builtin; $order++; } return $map; } private function validateNavigationMenuItem($item) { if (!$item instanceof PHUIListItemView) { throw new Exception(pht("\105\x78\160\x65\143\x74\x65\x64\40\x62\165\151\154\144\116\x61\166\x69\147\141\x74\x69\157\156\x4d\145\156\165\x49\x74\145\155\x73\x28\x29\40\164\x6f\40\x72\145\x74\x75\162\x6e\x20\141\x20\154\151\163\164\x20\157\x66\40" . "\x50\x48\x55\111\x4c\x69\x73\x74\111\164\x65\155\x56\x69\145\167\x20\x6f\142\x6a\145\x63\164\x73\54\40\142\165\164\40\147\157\x74\x20\x61\x20\x73\x75\x72\x70\x72\151\163\145\56")); } } public function getConfigureURI() { $mode = $this->getEditMode(); switch ($mode) { case self::MODE_CUSTOM: return $this->getItemURI("\x63\x6f\x6e\x66\x69\x67\165\162\x65\x2f\x63\x75\163\x74\x6f\x6d\x2f"); case self::MODE_GLOBAL: return $this->getItemURI("\143\x6f\x6e\146\151\147\x75\162\145\x2f\147\154\157\x62\141\154\x2f"); } return $this->getItemURI("\143\157\x6e\x66\151\x67\165\162\x65\x2f"); } private function buildItemReorderContent(array $items) { $viewer = $this->getViewer(); $object = $this->getProfileObject(); $custom_phid = $this->getEditModeCustomPHID(); if (!$custom_phid) { PhabricatorPolicyFilter::requireCapability($viewer, $object, PhabricatorPolicyCapability::CAN_EDIT); } else { $policy_object = id(new PhabricatorObjectQuery())->setViewer($viewer)->withPHIDs(array($custom_phid))->executeOne(); if (!$policy_object) { throw new Exception(pht("\x46\141\151\x6c\x65\x64\40\164\157\x20\x6c\157\141\144\x20\x63\x75\x73\x74\x6f\155\x20\120\x48\x49\x44\x20\x22\x25\163\x22\x21", $custom_phid)); } PhabricatorPolicyFilter::requireCapability($viewer, $policy_object, PhabricatorPolicyCapability::CAN_EDIT); } $controller = $this->getController(); $request = $controller->getRequest(); $request->validateCSRF(); $order = $request->getStrList("\x6f\x72\144\145\x72"); $by_builtin = array(); $by_id = array(); foreach ($items as $key => $item) { $id = $item->getID(); if ($id) { $by_id[$id] = $key; continue; } $builtin_key = $item->getBuiltinKey(); if ($builtin_key) { $by_builtin[$builtin_key] = $key; continue; } } $key_order = array(); foreach ($order as $order_item) { if (isset($by_id[$order_item])) { $key_order[] = $by_id[$order_item]; continue; } if (isset($by_builtin[$order_item])) { $key_order[] = $by_builtin[$order_item]; continue; } } $items = array_select_keys($items, $key_order) + $items; $type_order = PhabricatorProfileMenuItemConfigurationTransaction::TYPE_ORDER; $order = 1; foreach ($items as $item) { $xactions = array(); $xactions[] = id(new PhabricatorProfileMenuItemConfigurationTransaction())->setTransactionType($type_order)->setNewValue($order); $editor = id(new PhabricatorProfileMenuEditor())->setContentSourceFromRequest($request)->setActor($viewer)->setContinueOnMissingFields(true)->setContinueOnNoEffect(true)->applyTransactions($item, $xactions); $order++; } return id(new AphrontRedirectResponse())->setURI($this->getConfigureURI()); } protected function buildItemViewContent(PhabricatorProfileMenuItemConfiguration $item) { return $item->newPageContent(); } private function getViewerEditModes() { $modes = array(); $viewer = $this->getViewer(); if ($viewer->isLoggedIn() && $this->isMenuEnginePersonalizable()) { $modes[] = self::MODE_CUSTOM; } $object = $this->getProfileObject(); $can_edit = PhabricatorPolicyFilter::hasCapability($viewer, $object, PhabricatorPolicyCapability::CAN_EDIT); if ($can_edit) { $modes[] = self::MODE_GLOBAL; } return $modes; } protected function isMenuEnginePersonalizable() { return true; } public function isMenuEnginePinnable() { return !$this->isMenuEnginePersonalizable(); } private function buildMenuEditModeContent() { $viewer = $this->getViewer(); $modes = $this->getViewerEditModes(); if (!$modes) { return new Aphront404Response(); } if (count($modes) == 1) { $mode = head($modes); return id(new AphrontRedirectResponse())->setURI($this->getItemURI("\x63\157\156\x66\x69\x67\165\x72\145\57{$mode}\x2f")); } $menu = id(new PHUIObjectItemListView())->setUser($viewer); $modes = array_fuse($modes); if (isset($modes["\143\x75\x73\164\157\155"])) { $menu->addItem(id(new PHUIObjectItemView())->setHeader(pht("\120\x65\x72\x73\x6f\156\141\x6c\x20\x4d\x65\156\165\40\111\164\x65\x6d\163"))->setHref($this->getItemURI("\143\157\x6e\146\x69\x67\165\x72\145\x2f\x63\x75\163\164\x6f\x6d\57"))->setImageURI($viewer->getProfileImageURI())->addAttribute(pht("\105\x64\151\164\40\164\x68\x65\40\x6d\x65\156\x75\40\x66\x6f\162\40\171\x6f\165\x72\x20\x70\145\162\x73\x6f\156\141\x6c\40\141\x63\143\157\x75\156\x74\56"))); } if (isset($modes["\x67\x6c\157\142\141\x6c"])) { $icon = id(new PHUIIconView())->setIcon("\x66\x61\x2d\147\x6c\x6f\x62\145")->setBackground("\x62\x67\55\x62\154\165\x65"); $menu->addItem(id(new PHUIObjectItemView())->setHeader(pht("\x47\x6c\x6f\142\141\x6c\40\115\145\156\165\x20\x49\164\x65\155\163"))->setHref($this->getItemURI("\143\x6f\x6e\x66\151\147\x75\x72\x65\x2f\x67\154\x6f\142\x61\x6c\57"))->setImageIcon($icon)->addAttribute(pht("\x45\144\151\x74\40\x74\x68\145\x20\x67\154\157\142\x61\x6c\x20\x64\x65\146\x61\165\x6c\164\x20\155\145\156\x75\40\x66\x6f\x72\x20\x61\x6c\154\x20\165\163\x65\x72\163\56"))); } $box = id(new PHUIObjectBoxView())->setObjectList($menu); $header = id(new PHUIHeaderView())->setHeader(pht("\115\x61\x6e\x61\147\x65\x20\x4d\145\156\x75"))->setHeaderIcon("\x66\x61\x2d\154\151\x73\x74"); return id(new PHUITwoColumnView())->setHeader($header)->setFooter($box); } private function buildItemConfigureContent(array $items) { $viewer = $this->getViewer(); $object = $this->getProfileObject(); $filtered_groups = mgroup($items, "\x67\x65\x74\x4d\x65\x6e\x75\111\x74\x65\155\x4b\145\x79"); foreach ($filtered_groups as $group) { $first_item = head($group); $first_item->willGetMenuItemViewList($group); } if (!$this->getCustomPHID()) { PhabricatorPolicyFilter::requireCapability($viewer, $object, PhabricatorPolicyCapability::CAN_EDIT); } $list_id = celerity_generate_unique_node_id(); $mode = $this->getEditMode(); Javelin::initBehavior("\x72\x65\157\x72\144\x65\x72\x2d\x70\162\157\146\151\154\145\55\155\145\156\x75\55\x69\164\x65\155\x73", array("\x6c\x69\163\x74\111\104" => $list_id, "\x6f\162\x64\145\x72\125\x52\111" => $this->getItemURI("\x72\x65\157\162\144\145\x72\57{$mode}\x2f"))); $list = id(new PHUIObjectItemListView())->setID($list_id)->setNoDataString(pht("\x54\150\x69\x73\x20\x6d\x65\x6e\165\x20\143\x75\162\162\145\x6e\x74\x6c\171\40\150\x61\163\x20\x6e\x6f\40\x69\x74\145\155\x73\56")); $any_draggable = false; foreach ($items as $item) { $id = $item->getID(); $builtin_key = $item->getBuiltinKey(); $can_edit = PhabricatorPolicyFilter::hasCapability($viewer, $item, PhabricatorPolicyCapability::CAN_EDIT); $view = id(new PHUIObjectItemView()); $name = $item->getDisplayName(); $type = $item->getMenuItemTypeName(); if (!strlen(trim($name))) { $name = pht("\125\x6e\x74\151\x74\154\x65\x64\x20\42\45\163\42\40\111\x74\145\155", $type); } $view->setHeader($name); $view->addAttribute($type); $icon = $item->getMenuItem()->getMenuItemTypeIcon(); if ($icon !== null) { $view->setStatusIcon($icon); } if ($can_edit) { $can_move = !$item->getIsHeadItem() && !$item->getIsTailItem(); if ($can_move) { $view->setGrippable(true)->addSigil("\160\x72\157\x66\x69\154\x65\x2d\x6d\145\x6e\165\55\x69\x74\145\155")->setMetadata(array("\x6b\145\171" => nonempty($id, $builtin_key))); $any_draggable = true; } else { $view->setGrippable(false); } if ($id) { $default_uri = $this->getItemURI("\144\145\x66\141\x75\x6c\164\x2f{$id}\57"); } else { $default_uri = $this->getItemURI("\144\x65\x66\141\165\154\164\57{$builtin_key}\57"); } $default_text = null; if ($this->isMenuEnginePinnable()) { if ($item->isDefault()) { $default_icon = "\146\141\x2d\x74\150\165\155\x62\55\164\x61\x63\x6b\40\147\x72\x65\x65\x6e"; $default_text = pht("\103\165\x72\x72\145\x6e\x74\40\104\145\x66\x61\x75\x6c\x74"); } else { if ($item->canMakeDefault()) { $default_icon = "\146\141\x2d\x74\150\x75\155\142\55\164\x61\143\x6b"; $default_text = pht("\115\x61\153\x65\40\x44\x65\146\x61\165\x6c\x74"); } } } if ($default_text !== null) { $view->addAction(id(new PHUIListItemView())->setHref($default_uri)->setWorkflow(true)->setName($default_text)->setIcon($default_icon)); } if ($id) { $view->setHref($this->getItemURI("\145\144\x69\164\57{$id}\57")); $hide_uri = $this->getItemURI("\150\151\x64\x65\x2f{$id}\x2f"); } else { $view->setHref($this->getItemURI("\142\x75\151\154\x74\x69\x6e\57{$builtin_key}\57")); $hide_uri = $this->getItemURI("\150\151\144\x65\57{$builtin_key}\57"); } if ($item->isDisabled()) { $hide_icon = "\x66\141\55\160\x6c\165\x73"; $hide_text = pht("\x45\156\141\142\x6c\x65"); } else { if ($item->getBuiltinKey() !== null) { $hide_icon = "\x66\x61\x2d\x74\x69\x6d\145\x73"; $hide_text = pht("\x44\151\163\141\142\x6c\145"); } else { $hide_icon = "\146\141\x2d\164\x69\155\x65\x73"; $hide_text = pht("\104\145\154\145\x74\x65"); } } $can_disable = $item->canHideMenuItem(); $view->addAction(id(new PHUIListItemView())->setHref($hide_uri)->setWorkflow(true)->setDisabled(!$can_disable)->setName($hide_text)->setIcon($hide_icon)); } if ($item->isDisabled()) { $view->setDisabled(true); } $list->addItem($view); } $item_types = PhabricatorProfileMenuItem::getAllMenuItems(); $object = $this->getProfileObject(); $action_list = id(new PhabricatorActionListView())->setViewer($viewer); $action_list->setID(celerity_generate_unique_node_id()); $action_list->addAction(id(new PhabricatorActionView())->setLabel(true)->setName(pht("\x41\144\144\x20\x4e\145\x77\x20\115\145\156\x75\40\111\164\x65\155\56\x2e\x2e"))); foreach ($item_types as $item_type) { if (!$item_type->canAddToObject($object)) { continue; } $item_key = $item_type->getMenuItemKey(); $edit_mode = $this->getEditMode(); $action_list->addAction(id(new PhabricatorActionView())->setIcon($item_type->getMenuItemTypeIcon())->setName($item_type->getMenuItemTypeName())->setHref($this->getItemURI("\156\145\167\57{$edit_mode}\57{$item_key}\x2f"))->setWorkflow(true)); } $action_list->addAction(id(new PhabricatorActionView())->setLabel(true)->setName(pht("\x44\157\x63\165\x6d\145\x6e\164\141\x74\151\x6f\x6e"))); $doc_link = PhabricatorEnv::getDoclink("\x50\x72\x6f\x66\x69\154\145\x20\x4d\x65\x6e\165\40\x55\x73\x65\x72\40\x47\x75\x69\x64\145"); $doc_name = pht("\120\x72\x6f\x66\151\154\x65\40\x4d\x65\156\x75\x20\x55\163\145\x72\x20\x47\x75\x69\x64\145"); $action_list->addAction(id(new PhabricatorActionView())->setIcon("\x66\141\55\142\x6f\157\x6b")->setHref($doc_link)->setName($doc_name)); $header = id(new PHUIHeaderView())->setHeader(pht("\x4d\145\156\165\40\x49\x74\145\x6d\x73"))->setHeaderIcon("\146\141\55\x6c\151\163\164"); $list_header = id(new PHUIHeaderView())->setHeader(pht("\103\165\x72\162\x65\x6e\164\x20\115\x65\x6e\165\x20\x49\x74\145\155\x73")); if ($any_draggable) { $list_header->setSubheader(pht("\104\x72\x61\147\x20\x69\x74\x65\x6d\x73\40\151\x6e\40\164\x68\x69\x73\40\154\151\x73\x74\x20\164\x6f\40\x72\x65\157\162\x64\x65\162\40\164\x68\x65\155\56")); } $box = id(new PHUIObjectBoxView())->setHeader($list_header)->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)->setObjectList($list); $curtain = id(new PHUICurtainView())->setViewer($viewer)->setActionList($action_list); $view = id(new PHUITwoColumnView())->setHeader($header)->setCurtain($curtain)->setMainColumn(array($box)); return $view; } private function buildItemNewContent($item_key, $mode) { $item_types = PhabricatorProfileMenuItem::getAllMenuItems(); $item_type = idx($item_types, $item_key); if (!$item_type) { return new Aphront404Response(); } $object = $this->getProfileObject(); if (!$item_type->canAddToObject($object)) { return new Aphront404Response(); } $custom_phid = $this->getEditModeCustomPHID(); $configuration = PhabricatorProfileMenuItemConfiguration::initializeNewItem($object, $item_type, $custom_phid); $viewer = $this->getViewer(); PhabricatorPolicyFilter::requireCapability($viewer, $configuration, PhabricatorPolicyCapability::CAN_EDIT); $controller = $this->getController(); return id(new PhabricatorProfileMenuEditEngine())->setMenuEngine($this)->setProfileObject($object)->setNewMenuItemConfiguration($configuration)->setCustomPHID($custom_phid)->setController($controller)->buildResponse(); } private function buildItemEditContent() { $viewer = $this->getViewer(); $object = $this->getProfileObject(); $controller = $this->getController(); $custom_phid = $this->getEditModeCustomPHID(); return id(new PhabricatorProfileMenuEditEngine())->setMenuEngine($this)->setProfileObject($object)->setController($controller)->setCustomPHID($custom_phid)->buildResponse(); } private function buildItemBuiltinContent(PhabricatorProfileMenuItemConfiguration $configuration) { $id = $configuration->getID(); if ($id) { return id(new AphrontRedirectResponse())->setURI($this->getItemURI("\145\x64\151\x74\x2f{$id}\x2f")); } $viewer = $this->getViewer(); PhabricatorPolicyFilter::requireCapability($viewer, $configuration, PhabricatorPolicyCapability::CAN_EDIT); $object = $this->getProfileObject(); $controller = $this->getController(); $custom_phid = $this->getEditModeCustomPHID(); return id(new PhabricatorProfileMenuEditEngine())->setIsBuiltin(true)->setMenuEngine($this)->setProfileObject($object)->setNewMenuItemConfiguration($configuration)->setController($controller)->setCustomPHID($custom_phid)->buildResponse(); } private function buildItemHideContent(PhabricatorProfileMenuItemConfiguration $configuration) { $controller = $this->getController(); $request = $controller->getRequest(); $viewer = $this->getViewer(); PhabricatorPolicyFilter::requireCapability($viewer, $configuration, PhabricatorPolicyCapability::CAN_EDIT); if (!$configuration->canHideMenuItem()) { return $controller->newDialog()->setTitle(pht("\x4d\141\156\x64\141\x74\x6f\x72\171\40\111\164\145\x6d"))->appendParagraph(pht("\124\x68\x69\163\40\155\x65\156\x75\40\x69\164\x65\x6d\x20\151\163\x20\166\x65\x72\171\40\x69\x6d\160\x6f\x72\164\141\156\164\x2c\40\141\156\144\x20\143\x61\x6e\x20\x6e\157\164\40\x62\145\40\144\x69\163\x61\142\x6c\145\x64\56"))->addCancelButton($this->getConfigureURI()); } if ($configuration->getBuiltinKey() === null) { $new_value = null; $title = pht("\104\x65\154\145\x74\145\40\115\x65\x6e\x75\x20\x49\164\145\x6d"); $body = pht("\104\145\154\x65\164\145\x20\x74\150\x69\163\x20\x6d\145\156\x75\x20\151\164\145\x6d\77"); $button = pht("\104\145\154\x65\x74\x65\x20\x4d\145\156\165\40\111\164\x65\155"); } else { if ($configuration->isDisabled()) { $new_value = PhabricatorProfileMenuItemConfiguration::VISIBILITY_VISIBLE; $title = pht("\x45\x6e\141\x62\154\x65\x20\x4d\x65\x6e\x75\40\x49\x74\x65\x6d"); $body = pht("\x45\156\141\x62\154\145\40\x74\150\151\x73\40\155\145\x6e\165\40\x69\x74\x65\x6d\x3f\40\x49\x74\x20\x77\x69\x6c\154\x20\141\160\160\x65\x61\162\40\151\156\x20\164\150\145\x20\155\x65\156\165\40\141\x67\141\x69\156\56"); $button = pht("\x45\x6e\141\x62\x6c\145\40\x4d\x65\156\x75\x20\111\164\x65\155"); } else { $new_value = PhabricatorProfileMenuItemConfiguration::VISIBILITY_DISABLED; $title = pht("\104\151\x73\141\142\x6c\x65\x20\115\x65\156\165\x20\x49\x74\145\155"); $body = pht("\x44\151\x73\141\142\154\x65\40\164\x68\x69\x73\40\155\x65\x6e\165\40\151\164\x65\155\x3f\40\x49\164\x20\x77\x69\154\x6c\40\156\157\40\x6c\x6f\x6e\x67\145\x72\x20\141\160\x70\145\x61\x72\x20\151\156\x20\164\x68\145\40\155\x65\156\165\x2c\40\x62\165\164\x20" . "\171\157\x75\40\x63\x61\x6e\x20\x72\x65\55\x65\156\x61\142\154\x65\40\x69\164\40\154\x61\x74\145\162\56"); $button = pht("\x44\x69\163\x61\x62\x6c\145\40\115\145\156\x75\40\111\164\145\155"); } } $v_visibility = $configuration->getVisibility(); if ($request->isFormPost()) { if ($new_value === null) { $configuration->delete(); } else { $type_visibility = PhabricatorProfileMenuItemConfigurationTransaction::TYPE_VISIBILITY; $xactions = array(); $xactions[] = id(new PhabricatorProfileMenuItemConfigurationTransaction())->setTransactionType($type_visibility)->setNewValue($new_value); $editor = id(new PhabricatorProfileMenuEditor())->setContentSourceFromRequest($request)->setActor($viewer)->setContinueOnMissingFields(true)->setContinueOnNoEffect(true)->applyTransactions($configuration, $xactions); } return id(new AphrontRedirectResponse())->setURI($this->getConfigureURI()); } return $controller->newDialog()->setTitle($title)->appendParagraph($body)->addCancelButton($this->getConfigureURI())->addSubmitButton($button); } private function buildItemDefaultContent(PhabricatorProfileMenuItemConfiguration $configuration) { $controller = $this->getController(); $request = $controller->getRequest(); $viewer = $this->getViewer(); PhabricatorPolicyFilter::requireCapability($viewer, $configuration, PhabricatorPolicyCapability::CAN_EDIT); $done_uri = $this->getConfigureURI(); if (!$configuration->canMakeDefault()) { return $controller->newDialog()->setTitle(pht("\x4e\x6f\164\40\x44\x65\146\141\165\x6c\x74\141\x62\154\145"))->appendParagraph(pht("\124\150\151\x73\40\x69\x74\x65\x6d\40\143\x61\156\x20\x6e\157\x74\40\x62\x65\40\163\x65\x74\x20\x61\163\40\164\x68\x65\40\x64\145\x66\141\x75\154\x74\x20\151\x74\x65\155\x2e\x20\124\150\151\163\x20\151\x73\x20\x75\163\165\141\x6c\x6c\x79\x20" . "\x62\x65\143\141\x75\x73\145\40\x74\x68\x65\40\x69\x74\145\155\x20\150\141\x73\40\x6e\x6f\40\160\141\147\145\x20\157\146\x20\151\x74\x73\40\157\x77\x6e\54\40\157\162\40\154\x69\x6e\153\x73\40\x74\x6f\x20\x61\156\40" . "\145\x78\x74\x65\x72\x6e\141\154\40\x70\141\147\145\x2e"))->addCancelButton($done_uri); } if ($configuration->isDefault()) { return $controller->newDialog()->setTitle(pht("\101\154\x72\x65\x61\144\171\x20\104\145\146\141\x75\x6c\x74"))->appendParagraph(pht("\124\x68\x69\x73\40\x69\164\145\x6d\40\x69\163\x20\x61\154\x72\145\x61\144\171\x20\163\145\x74\40\141\x73\40\x74\x68\145\40\144\x65\146\141\x75\x6c\164\x20\x69\164\145\155\x20\146\x6f\162\x20\164\x68\151\163\x20\x6d\x65\x6e\x75\56"))->addCancelButton($done_uri); } if ($request->isFormPost()) { $key = $configuration->getID(); if (!$key) { $key = $configuration->getBuiltinKey(); } $this->adjustDefault($key); return id(new AphrontRedirectResponse())->setURI($done_uri); } return $controller->newDialog()->setTitle(pht("\115\x61\153\145\x20\x44\145\146\141\x75\x6c\x74"))->appendParagraph(pht("\123\x65\x74\40\164\150\151\x73\40\x69\164\145\x6d\40\x61\163\40\x74\x68\x65\40\x64\145\146\x61\165\x6c\x74\40\146\157\162\40\x74\x68\151\163\40\x6d\x65\156\x75\77\x20\125\x73\145\162\163\x20\141\x72\162\151\x76\151\x6e\x67\40\x6f\156\40" . "\164\x68\151\x73\40\160\141\x67\x65\40\167\151\154\154\x20\142\145\40\x73\x68\x6f\167\x6e\40\164\150\145\x20\143\157\156\164\145\x6e\x74\40\157\146\x20\164\x68\x69\163\40\151\164\x65\x6d\x20\x62\171\40\x64\x65\x66\x61\x75\x6c\164\56"))->addCancelButton($done_uri)->addSubmitButton(pht("\115\x61\153\145\x20\104\145\146\141\x75\154\164")); } protected function newItem() { return PhabricatorProfileMenuItemConfiguration::initializeNewBuiltin(); } protected function newManageItem() { return $this->newItem()->setBuiltinKey(self::ITEM_MANAGE)->setMenuItemKey(PhabricatorManageProfileMenuItem::MENUITEMKEY)->setIsTailItem(true); } protected function newDividerItem($key) { return $this->newItem()->setBuiltinKey($key)->setMenuItemKey(PhabricatorDividerProfileMenuItem::MENUITEMKEY)->setIsTailItem(true); } public function getDefaultMenuItemConfiguration() { $configs = $this->getItems(); foreach ($configs as $config) { if ($config->isDefault()) { return $config; } } return null; } public function adjustDefault($key) { $controller = $this->getController(); $request = $controller->getRequest(); $viewer = $request->getViewer(); $items = $this->loadItems(self::MODE_COMBINED); $default = array(); $visible = array(); foreach ($items as $item) { $builtin_key = $item->getBuiltinKey(); $id = $item->getID(); $is_target = $builtin_key !== null && $builtin_key === $key || $id !== null && (int) $id === (int) $key; if ($is_target) { if (!$item->isDefault()) { $default[] = $item; } } else { if ($item->isDefault()) { $visible[] = $item; } } } $type_visibility = PhabricatorProfileMenuItemConfigurationTransaction::TYPE_VISIBILITY; $v_visible = PhabricatorProfileMenuItemConfiguration::VISIBILITY_VISIBLE; $v_default = PhabricatorProfileMenuItemConfiguration::VISIBILITY_DEFAULT; $apply = array(array($v_visible, $visible), array($v_default, $default)); foreach ($apply as $group) { list($value, $items) = $group; foreach ($items as $item) { $xactions = array(); $xactions[] = id(new PhabricatorProfileMenuItemConfigurationTransaction())->setTransactionType($type_visibility)->setNewValue($value); $editor = id(new PhabricatorProfileMenuEditor())->setContentSourceFromRequest($request)->setActor($viewer)->setContinueOnMissingFields(true)->setContinueOnNoEffect(true)->applyTransactions($item, $xactions); } } return $this; } private function arrangeItems(array $items, $mode) { $items = msortv($items, "\x67\145\164\123\x6f\x72\164\x56\x65\143\x74\x6f\x72"); $object = $this->getProfileObject(); if ($mode == self::MODE_COMBINED) { $list = array(); $seen_custom = false; $seen_global = false; foreach ($items as $item) { if ($item->getCustomPHID()) { $seen_custom = true; } else { if ($seen_custom && !$seen_global) { $list[] = $this->newItem()->setBuiltinKey(self::ITEM_CUSTOM_DIVIDER)->setMenuItemKey(PhabricatorDividerProfileMenuItem::MENUITEMKEY)->attachProfileObject($object)->attachMenuItem(new PhabricatorDividerProfileMenuItem()); } $seen_global = true; } $list[] = $item; } $items = $list; } $items = array_values($items); return $items; } protected final function newEmptyView($title, $message) { return id(new PHUIInfoView())->setTitle($title)->setSeverity(PHUIInfoView::SEVERITY_NODATA)->setErrors(array($message)); } protected function newNoContentView(array $items) { return $this->newEmptyView(pht("\116\157\x20\x43\157\156\164\x65\156\x74"), pht("\116\157\40\166\x69\x73\151\x62\x6c\x65\40\155\x65\156\x75\x20\x69\164\145\x6d\163\40\x63\x61\x6e\x20\x72\145\x6e\144\145\162\40\143\x6f\x6e\164\145\156\164\x2e")); } public final function newProfileMenuItemViewList() { $items = $this->getItems(); foreach ($items as $key => $item) { if ($item->isDisabled()) { unset($items[$key]); continue; } } $groups = mgroup($items, "\147\145\164\115\145\x6e\x75\111\164\145\155\x4b\x65\171"); foreach ($groups as $group) { $item = head($group); $item->willGetMenuItemViewList($group); } $view_list = id(new PhabricatorProfileMenuItemViewList())->setProfileMenuEngine($this); foreach ($items as $item) { $views = $item->getMenuItemViewList(); foreach ($views as $view) { $view_list->addItemView($view); } } return $view_list; } private function selectViewItem(PhabricatorProfileMenuItemViewList $view_list, $item_id) { $selected_view = null; if ($item_id !== null && strlen($item_id)) { $item_views = $view_list->getViewsWithItemIdentifier($item_id); if ($item_views) { $selected_view = head($item_views); } } else { $default_views = $view_list->getDefaultViews(); if ($default_views) { $selected_view = head($default_views); } } if ($selected_view) { $view_list->setSelectedView($selected_view); $selected_item = $selected_view->getMenuItemConfiguration(); } else { $selected_item = null; } return $selected_item; } private function selectEditItem(PhabricatorProfileMenuItemViewList $view_list, $item_id) { if ($item_id) { $selected_item = $this->selectViewItem($view_list, $item_id); if ($selected_item) { return $selected_item; } } foreach ($this->getItems() as $item) { if ($item->matchesIdentifier($item_id)) { return $item; } } return null; } }

Function Calls

None

Variables

None

Stats

MD5 65fb2ac9966963b657d97240746b306b
Eval Count 0
Decode Time 165 ms