diff --git a/src/controller/instance/SemiStructuredObjectInstanceController.php b/src/controller/instance/SemiStructuredObjectInstanceController.php index 66c39b2..9f45643 100644 --- a/src/controller/instance/SemiStructuredObjectInstanceController.php +++ b/src/controller/instance/SemiStructuredObjectInstanceController.php @@ -1,72 +1,74 @@ object = $object; return $this; } public function getObject() { return $this->object; } protected function buildHeaderView() { $viewer = $this->getViewer(); $object = $this->getObject(); $object_type = $object->getClass(); if ($object_type->isArchived()) { $status_icon = 'fa-ban'; $status_color = 'dark'; } else { $status_icon = 'fa-check'; $status_color = 'bluegrey'; } $status_name = idx( SemiStructuredObjectType::getStatusNameMap(), $object_type->getStatus()); return id(new PHUIHeaderView()) ->setHeader( pht( '%s: %d %s', $object_type->getName(), $object->getID(), $object->getName())) ->setUser($viewer) ->setPolicyObject($object_type) ->setStatus($status_icon, $status_color, $status_name) ->setHeaderIcon(SemiStructuredDataApplication::ICON_OBJECT_TYPE); } protected function buildApplicationCrumbs() { $object = $this->getObject(); $object_type = $object->getClass(); $can_create = true; $crumbs = parent::buildApplicationCrumbs(); - $crumbs->addTextCrumb($object_type->getName(), $object_type->getURI()); + $crumbs->addTextCrumb( + $object_type->getName(), + $object_type->getURI('items/')); $crumbs->addTextCrumb( pht('%d %s', $object->getID(), $object->getName()), $object->getURI()); $crumbs->setBorder(true); $crumbs->addAction( id(new PHUIListItemView()) ->setName(pht('Create %s', $object_type->getName())) - ->setHref($this->getApplicationURI("type/{$object_type->getID()}/new/")) + ->setHref($object_type->getURI('new/')) ->setIcon('fa-plus-square') ->setWorkflow(!$can_create) ->setDisabled(!$can_create)); return $crumbs; } } diff --git a/src/storage/SemiStructuredObjectType.php b/src/storage/SemiStructuredObjectType.php index 7738987..296f30c 100644 --- a/src/storage/SemiStructuredObjectType.php +++ b/src/storage/SemiStructuredObjectType.php @@ -1,204 +1,204 @@ setName('') ->setViewPolicy(PhabricatorPolicies::getMostOpenPolicy()) ->setEditPolicy($actor->getPHID()) ->setStatus(self::STATUS_ACTIVE); } public function getCustomFieldsConfig() { if (!$this->customFieldsConfig) { return array(); } return $this->customFieldsConfig; } public static function getStatusNameMap() { return array( self::STATUS_ACTIVE => pht('Active'), self::STATUS_ARCHIVED => pht('Archived'), ); } protected function getConfiguration() { return array( self::CONFIG_AUX_PHID => true, self::CONFIG_SERIALIZATION => array( 'customFieldsConfig' => self::SERIALIZATION_JSON, ), self::CONFIG_COLUMN_SCHEMA => array( 'name' => 'sort255', 'status' => 'text32', 'description' => 'text', ), ) + parent::getConfiguration(); } public function getPHIDType() { return SemiStructuredObjectTypePHIDType::TYPECONST; } public function isArchived() { return ($this->getStatus() == self::STATUS_ARCHIVED); } - public function getURI() { - return urisprintf('/semistruct/type/%d/', $this->getID()); + public function getURI($path = '') { + return urisprintf('/semistruct/type/%d/%s', $this->getID(), $path); } public function getObjectName() { return pht('Object Type %d', $this->getID()); } public function getIcon() { // TODO copy the feature from Projects, where you can put a custom image // or select from a list. return SemiStructuredDataApplication::ICON_OBJECT_TYPE; } /* -( PhabricatorApplicationTransactionInterface )------------------------- */ public function getApplicationTransactionEditor() { return new SemiStructuredObjectTypeTransactionEditor(); } public function getApplicationTransactionTemplate() { return new SemiStructuredObjectTypeTransaction(); } /* -( PhabricatorPolicyInterface )----------------------------------------- */ public function getCapabilities() { return array( PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT, // TODO can-create-instances ); } public function getPolicy($capability) { switch ($capability) { case PhabricatorPolicyCapability::CAN_VIEW: return $this->getViewPolicy(); case PhabricatorPolicyCapability::CAN_EDIT: return $this->getEditPolicy(); } } public function hasAutomaticCapability($capability, PhabricatorUser $viewer) { return false; } /* -( PhabricatorConduitResultInterface )---------------------------------- */ public function getFieldSpecificationsForConduit() { return array( (new PhabricatorConduitSearchFieldSpecification()) ->setKey('name') ->setType('string') ->setDescription(pht('The name of the object type.')), (new PhabricatorConduitSearchFieldSpecification()) ->setKey('description') ->setType('remarkup') ->setDescription(pht('The description.')), (new PhabricatorConduitSearchFieldSpecification()) ->setKey('status') ->setType('string') ->setDescription(pht('Status of this object data.')), (new PhabricatorConduitSearchFieldSpecification()) ->setKey('customFieldsConfig') ->setType('map') ->setDescription(pht('Custom Fields definition')), ); } public function getFieldValuesForConduit() { return array( 'name' => $this->getName(), 'description' => array( 'raw' => $this->getDescription(), ), 'status' => $this->getStatus(), 'customFieldsConfig' => $this->getCustomFieldsConfig(), ); } public function getConduitSearchAttachments() { return array(); } /* -( PhabricatorFerretInterface )----------------------------------------- */ public function newFerretEngine() { return new SemiStructuredObjectTypeFerretEngine(); } /* -( PhabricatorFulltextInterface )--------------------------------------- */ public function newFulltextEngine() { return new SemiStructuredObjectTypeFulltextEngine(); } /* -( PhabricatorDestructibleInterface )----------------------------------- */ public function destroyObjectPermanently( PhabricatorDestructionEngine $engine) { $this->openTransaction(); $this->delete(); $this->saveTransaction(); } /* -( PhabricatorSubscribableInterface )----------------------------------- */ public function isAutomaticallySubscribed($phid) { return false; } }