diff --git a/resources/celerity/map.php b/resources/celerity/map.php
--- a/resources/celerity/map.php
+++ b/resources/celerity/map.php
@@ -9,7 +9,7 @@
'names' => array(
'conpherence.pkg.css' => 'b2d6f4b8',
'conpherence.pkg.js' => '020aebcf',
- 'core.pkg.css' => '8ee41b37',
+ 'core.pkg.css' => '5fb9829e',
'core.pkg.js' => '83c66b30',
'dark-console.pkg.js' => '187792c2',
'differential.pkg.css' => '0dac8831',
@@ -147,7 +147,7 @@
'rsrc/css/phui/phui-document.css' => 'a9154763',
'rsrc/css/phui/phui-feed-story.css' => '1dd2e4c0',
'rsrc/css/phui/phui-fontkit.css' => '1ec937e5',
- 'rsrc/css/phui/phui-form-view.css' => '029b1ef9',
+ 'rsrc/css/phui/phui-form-view.css' => '0febcbf6',
'rsrc/css/phui/phui-form.css' => '0ce5b5b8',
'rsrc/css/phui/phui-formation-view.css' => 'b172a0b3',
'rsrc/css/phui/phui-head-thing.css' => 'd7f293df',
@@ -775,7 +775,7 @@
'phui-font-icon-base-css' => 'b7608e58',
'phui-fontkit-css' => '1ec937e5',
'phui-form-css' => '0ce5b5b8',
- 'phui-form-view-css' => '029b1ef9',
+ 'phui-form-view-css' => '0febcbf6',
'phui-formation-view-css' => 'b172a0b3',
'phui-head-thing-view-css' => 'd7f293df',
'phui-header-view-css' => '521ef411',
diff --git a/src/applications/conduit/controller/PhabricatorConduitTokenEditController.php b/src/applications/conduit/controller/PhabricatorConduitTokenEditController.php
--- a/src/applications/conduit/controller/PhabricatorConduitTokenEditController.php
+++ b/src/applications/conduit/controller/PhabricatorConduitTokenEditController.php
@@ -96,6 +96,7 @@
->setLabel(pht('Token'))
->setReadOnly(true)
->setSigil('select-on-click')
+ ->setHasCopyButton(true)
->setValue($token->getToken()));
$dialog->appendForm($form);
diff --git a/src/applications/differential/view/DifferentialChangesetDetailView.php b/src/applications/differential/view/DifferentialChangesetDetailView.php
--- a/src/applications/differential/view/DifferentialChangesetDetailView.php
+++ b/src/applications/differential/view/DifferentialChangesetDetailView.php
@@ -246,7 +246,7 @@
'tip' => pht('Copy file path'),
'text' => $display_filename,
'successMessage' => pht('File path copied.'),
- 'errorMessage' => pht('Copy of file path failed.'),
+ 'errorMessage' => pht('Copying failed.'),
));
return javelin_tag(
diff --git a/src/applications/diffusion/view/DiffusionCloneURIView.php b/src/applications/diffusion/view/DiffusionCloneURIView.php
--- a/src/applications/diffusion/view/DiffusionCloneURIView.php
+++ b/src/applications/diffusion/view/DiffusionCloneURIView.php
@@ -100,7 +100,7 @@
'tip' => pht('Copy repository URI'),
'text' => $display,
'successMessage' => pht('Repository URI copied.'),
- 'errorMessage' => pht('Copy of Repository URI failed.'),
+ 'errorMessage' => pht('Copying failed.'),
));
switch ($uri->getEffectiveIOType()) {
diff --git a/src/view/form/control/AphrontFormControl.php b/src/view/form/control/AphrontFormControl.php
--- a/src/view/form/control/AphrontFormControl.php
+++ b/src/view/form/control/AphrontFormControl.php
@@ -15,6 +15,7 @@
private $required;
private $hidden;
private $classes;
+ private $hasCopyButton;
public function setHidden($hidden) {
$this->hidden = $hidden;
@@ -114,6 +115,33 @@
return $this;
}
+ /**
+ * Whether a button is displayed next to the control which allows the user to
+ * copy the value in the form control. Common use cases include
+ * (AphrontFormTextControl) and