diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -44,6 +44,8 @@ 'AlmanacCreateServicesCapability' => 'applications/almanac/capability/AlmanacCreateServicesCapability.php', 'AlmanacCustomServiceType' => 'applications/almanac/servicetype/AlmanacCustomServiceType.php', 'AlmanacDAO' => 'applications/almanac/storage/AlmanacDAO.php', + 'AlmanacDeletePropertyEditField' => 'applications/almanac/engineextension/AlmanacDeletePropertyEditField.php', + 'AlmanacDeletePropertyEditType' => 'applications/almanac/engineextension/AlmanacDeletePropertyEditType.php', 'AlmanacDevice' => 'applications/almanac/storage/AlmanacDevice.php', 'AlmanacDeviceController' => 'applications/almanac/controller/AlmanacDeviceController.php', 'AlmanacDeviceDeletePropertyTransaction' => 'applications/almanac/xaction/AlmanacDeviceDeletePropertyTransaction.php', @@ -129,6 +131,7 @@ 'AlmanacNetworkTransactionType' => 'applications/almanac/xaction/AlmanacNetworkTransactionType.php', 'AlmanacNetworkViewController' => 'applications/almanac/controller/AlmanacNetworkViewController.php', 'AlmanacPropertiesDestructionEngineExtension' => 'applications/almanac/engineextension/AlmanacPropertiesDestructionEngineExtension.php', + 'AlmanacPropertiesEditEngineExtension' => 'applications/almanac/engineextension/AlmanacPropertiesEditEngineExtension.php', 'AlmanacPropertiesSearchEngineAttachment' => 'applications/almanac/engineextension/AlmanacPropertiesSearchEngineAttachment.php', 'AlmanacProperty' => 'applications/almanac/storage/AlmanacProperty.php', 'AlmanacPropertyController' => 'applications/almanac/controller/AlmanacPropertyController.php', @@ -165,6 +168,8 @@ 'AlmanacServiceTypeTestCase' => 'applications/almanac/servicetype/__tests__/AlmanacServiceTypeTestCase.php', 'AlmanacServiceTypeTransaction' => 'applications/almanac/xaction/AlmanacServiceTypeTransaction.php', 'AlmanacServiceViewController' => 'applications/almanac/controller/AlmanacServiceViewController.php', + 'AlmanacSetPropertyEditField' => 'applications/almanac/engineextension/AlmanacSetPropertyEditField.php', + 'AlmanacSetPropertyEditType' => 'applications/almanac/engineextension/AlmanacSetPropertyEditType.php', 'AlmanacTransactionType' => 'applications/almanac/xaction/AlmanacTransactionType.php', 'AphlictDropdownDataQuery' => 'applications/aphlict/query/AphlictDropdownDataQuery.php', 'Aphront304Response' => 'aphront/response/Aphront304Response.php', @@ -5246,6 +5251,8 @@ 'AlmanacCreateServicesCapability' => 'PhabricatorPolicyCapability', 'AlmanacCustomServiceType' => 'AlmanacServiceType', 'AlmanacDAO' => 'PhabricatorLiskDAO', + 'AlmanacDeletePropertyEditField' => 'PhabricatorEditField', + 'AlmanacDeletePropertyEditType' => 'PhabricatorEditType', 'AlmanacDevice' => array( 'AlmanacDAO', 'PhabricatorPolicyInterface', @@ -5365,6 +5372,7 @@ 'AlmanacNetworkTransactionType' => 'AlmanacTransactionType', 'AlmanacNetworkViewController' => 'AlmanacNetworkController', 'AlmanacPropertiesDestructionEngineExtension' => 'PhabricatorDestructionEngineExtension', + 'AlmanacPropertiesEditEngineExtension' => 'PhabricatorEditEngineExtension', 'AlmanacPropertiesSearchEngineAttachment' => 'AlmanacSearchEngineAttachment', 'AlmanacProperty' => array( 'AlmanacDAO', @@ -5413,6 +5421,8 @@ 'AlmanacServiceTypeTestCase' => 'PhabricatorTestCase', 'AlmanacServiceTypeTransaction' => 'AlmanacServiceTransactionType', 'AlmanacServiceViewController' => 'AlmanacServiceController', + 'AlmanacSetPropertyEditField' => 'PhabricatorEditField', + 'AlmanacSetPropertyEditType' => 'PhabricatorEditType', 'AlmanacTransactionType' => 'PhabricatorModularTransactionType', 'AphlictDropdownDataQuery' => 'Phobject', 'Aphront304Response' => 'AphrontResponse', diff --git a/src/applications/almanac/editor/AlmanacBindingEditEngine.php b/src/applications/almanac/editor/AlmanacBindingEditEngine.php --- a/src/applications/almanac/editor/AlmanacBindingEditEngine.php +++ b/src/applications/almanac/editor/AlmanacBindingEditEngine.php @@ -91,7 +91,8 @@ } protected function newObjectQuery() { - return new AlmanacBindingQuery(); + return id(new AlmanacBindingQuery()) + ->needProperties(true); } protected function getObjectCreateTitleText($object) { diff --git a/src/applications/almanac/editor/AlmanacDeviceEditEngine.php b/src/applications/almanac/editor/AlmanacDeviceEditEngine.php --- a/src/applications/almanac/editor/AlmanacDeviceEditEngine.php +++ b/src/applications/almanac/editor/AlmanacDeviceEditEngine.php @@ -30,7 +30,8 @@ } protected function newObjectQuery() { - return new AlmanacDeviceQuery(); + return id(new AlmanacDeviceQuery()) + ->needProperties(true); } protected function getObjectCreateTitleText($object) { diff --git a/src/applications/almanac/editor/AlmanacServiceEditEngine.php b/src/applications/almanac/editor/AlmanacServiceEditEngine.php --- a/src/applications/almanac/editor/AlmanacServiceEditEngine.php +++ b/src/applications/almanac/editor/AlmanacServiceEditEngine.php @@ -79,7 +79,8 @@ } protected function newObjectQuery() { - return new AlmanacServiceQuery(); + return id(new AlmanacServiceQuery()) + ->needProperties(true); } protected function getObjectCreateTitleText($object) { diff --git a/src/applications/almanac/engineextension/AlmanacDeletePropertyEditField.php b/src/applications/almanac/engineextension/AlmanacDeletePropertyEditField.php new file mode 100644 --- /dev/null +++ b/src/applications/almanac/engineextension/AlmanacDeletePropertyEditField.php @@ -0,0 +1,22 @@ +<?php + +final class AlmanacDeletePropertyEditField + extends PhabricatorEditField { + + protected function newControl() { + return null; + } + + protected function newHTTPParameterType() { + return null; + } + + protected function newConduitParameterType() { + return new ConduitStringListParameterType(); + } + + protected function newEditType() { + return new AlmanacDeletePropertyEditType(); + } + +} diff --git a/src/applications/almanac/engineextension/AlmanacDeletePropertyEditType.php b/src/applications/almanac/engineextension/AlmanacDeletePropertyEditType.php new file mode 100644 --- /dev/null +++ b/src/applications/almanac/engineextension/AlmanacDeletePropertyEditType.php @@ -0,0 +1,36 @@ +<?php + +final class AlmanacDeletePropertyEditType + extends PhabricatorEditType { + + public function generateTransactions( + PhabricatorApplicationTransaction $template, + array $spec) { + + $value = idx($spec, 'value'); + if (!is_array($value)) { + throw new Exception( + pht( + 'Transaction value when deleting Almanac properties must be a list '. + 'of property names.')); + } + + $xactions = array(); + foreach ($value as $idx => $property_key) { + if (!is_string($property_key)) { + throw new Exception( + pht( + 'When deleting Almanac properties, each property name must '. + 'be a string. The value at index "%s" is not a string.', + $idx)); + } + + $xactions[] = $this->newTransaction($template) + ->setMetadataValue('almanac.property', $property_key) + ->setNewValue(true); + } + + return $xactions; + } + +} diff --git a/src/applications/almanac/engineextension/AlmanacPropertiesEditEngineExtension.php b/src/applications/almanac/engineextension/AlmanacPropertiesEditEngineExtension.php new file mode 100644 --- /dev/null +++ b/src/applications/almanac/engineextension/AlmanacPropertiesEditEngineExtension.php @@ -0,0 +1,44 @@ +<?php + +final class AlmanacPropertiesEditEngineExtension + extends PhabricatorEditEngineExtension { + + const EXTENSIONKEY = 'almanac.properties'; + + public function isExtensionEnabled() { + return true; + } + + public function getExtensionName() { + return pht('Almanac Properties'); + } + + public function supportsObject( + PhabricatorEditEngine $engine, + PhabricatorApplicationTransactionInterface $object) { + return ($object instanceof AlmanacPropertyInterface); + } + + public function buildCustomEditFields( + PhabricatorEditEngine $engine, + PhabricatorApplicationTransactionInterface $object) { + + return array( + id(new AlmanacSetPropertyEditField()) + ->setKey('property.set') + ->setTransactionType($object->getAlmanacPropertySetTransactionType()) + ->setConduitDescription( + pht('Pass a map of values to set one or more properties.')) + ->setConduitTypeDescription(pht('Map of property names to values.')) + ->setIsConduitOnly(true), + id(new AlmanacDeletePropertyEditField()) + ->setKey('property.delete') + ->setTransactionType($object->getAlmanacPropertyDeleteTransactionType()) + ->setConduitDescription( + pht('Pass a list of property names to delete properties.')) + ->setConduitTypeDescription(pht('List of property names.')) + ->setIsConduitOnly(true), + ); + } + +} diff --git a/src/applications/almanac/engineextension/AlmanacSetPropertyEditField.php b/src/applications/almanac/engineextension/AlmanacSetPropertyEditField.php new file mode 100644 --- /dev/null +++ b/src/applications/almanac/engineextension/AlmanacSetPropertyEditField.php @@ -0,0 +1,22 @@ +<?php + +final class AlmanacSetPropertyEditField + extends PhabricatorEditField { + + protected function newControl() { + return null; + } + + protected function newHTTPParameterType() { + return null; + } + + protected function newConduitParameterType() { + return new ConduitWildParameterType(); + } + + protected function newEditType() { + return new AlmanacSetPropertyEditType(); + } + +} diff --git a/src/applications/almanac/engineextension/AlmanacSetPropertyEditType.php b/src/applications/almanac/engineextension/AlmanacSetPropertyEditType.php new file mode 100644 --- /dev/null +++ b/src/applications/almanac/engineextension/AlmanacSetPropertyEditType.php @@ -0,0 +1,28 @@ +<?php + +final class AlmanacSetPropertyEditType + extends PhabricatorEditType { + + public function generateTransactions( + PhabricatorApplicationTransaction $template, + array $spec) { + + $value = idx($spec, 'value'); + if (!is_array($value)) { + throw new Exception( + pht( + 'Transaction value when setting Almanac properties must be a map '. + 'with property names as keys.')); + } + + $xactions = array(); + foreach ($value as $property_key => $property_value) { + $xactions[] = $this->newTransaction($template) + ->setMetadataValue('almanac.property', $property_key) + ->setNewValue($property_value); + } + + return $xactions; + } + +}