From ce8a406424d42352f10c68403af29a310d7d60fc Mon Sep 17 00:00:00 2001 From: epriestley Date: Sun, 22 May 2011 17:06:42 -0700 Subject: [PATCH] Improve file preview in Maniphest Summary: Show large thumbnails of attached files in Maniphest. Test Plan: Looked at large thumbnails in Maniphest. Reviewed By: jungejason Reviewers: tomo, aran, jungejason, tuomaspelkonen CC: anjali, aran, epriestley, jungejason Differential Revision: 335 --- src/__celerity_resource_map__.php | 2 +- src/__phutil_library_map__.php | 2 + .../files/storage/file/PhabricatorFile.php | 5 ++ .../ManiphestTaskDetailController.php | 21 +++++-- .../controller/taskdetail/__init__.php | 2 + .../AphrontFormDragAndDropUploadControl.php | 16 +++--- .../filepreview/AphrontFilePreviewView.php | 57 +++++++++++++++++++ src/view/layout/filepreview/__init__.php | 15 +++++ .../rsrc/css/aphront/attached-file-view.css | 15 +++++ 9 files changed, 121 insertions(+), 14 deletions(-) create mode 100644 src/view/layout/filepreview/AphrontFilePreviewView.php create mode 100644 src/view/layout/filepreview/__init__.php diff --git a/src/__celerity_resource_map__.php b/src/__celerity_resource_map__.php index 58f03c026d..fb28d12dd5 100644 --- a/src/__celerity_resource_map__.php +++ b/src/__celerity_resource_map__.php @@ -9,7 +9,7 @@ celerity_register_resource_map(array( 'aphront-attached-file-view-css' => array( - 'uri' => '/res/79bc2c2e/rsrc/css/aphront/attached-file-view.css', + 'uri' => '/res/bac9f95c/rsrc/css/aphront/attached-file-view.css', 'type' => 'css', 'requires' => array( diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index 9ede479f5a..18f18faec6 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -23,6 +23,7 @@ phutil_register_library_map(array( 'AphrontDialogView' => 'view/dialog', 'AphrontErrorView' => 'view/form/error', 'AphrontException' => 'aphront/exception/base', + 'AphrontFilePreviewView' => 'view/layout/filepreview', 'AphrontFileResponse' => 'aphront/response/file', 'AphrontFormCheckboxControl' => 'view/form/control/checkbox', 'AphrontFormControl' => 'view/form/control/base', @@ -537,6 +538,7 @@ phutil_register_library_map(array( 'AphrontDialogResponse' => 'AphrontResponse', 'AphrontDialogView' => 'AphrontView', 'AphrontErrorView' => 'AphrontView', + 'AphrontFilePreviewView' => 'AphrontView', 'AphrontFileResponse' => 'AphrontResponse', 'AphrontFormCheckboxControl' => 'AphrontFormControl', 'AphrontFormControl' => 'AphrontView', diff --git a/src/applications/files/storage/file/PhabricatorFile.php b/src/applications/files/storage/file/PhabricatorFile.php index 56d1a35fa7..b2a53948cd 100644 --- a/src/applications/files/storage/file/PhabricatorFile.php +++ b/src/applications/files/storage/file/PhabricatorFile.php @@ -206,6 +206,11 @@ class PhabricatorFile extends PhabricatorFileDAO { return '/file/xform/thumb-60x45/'.$this->getPHID().'/'; } + public function getThumb160x120URI() { + return '/file/xform/thumb-160x120/'.$this->getPHID().'/'; + } + + public function isViewableInBrowser() { return ($this->getViewableMimeType() !== null); } diff --git a/src/applications/maniphest/controller/taskdetail/ManiphestTaskDetailController.php b/src/applications/maniphest/controller/taskdetail/ManiphestTaskDetailController.php index 662d13db17..9de54238a5 100644 --- a/src/applications/maniphest/controller/taskdetail/ManiphestTaskDetailController.php +++ b/src/applications/maniphest/controller/taskdetail/ManiphestTaskDetailController.php @@ -121,13 +121,22 @@ class ManiphestTaskDetailController extends ManiphestController { } if (idx($attached, PhabricatorPHIDConstants::PHID_TYPE_FILE)) { - $revs = idx($attached, PhabricatorPHIDConstants::PHID_TYPE_FILE); - $rev_links = array(); - foreach ($revs as $rev => $info) { - $rev_links[] = $handles[$rev]->renderLink(); + $file_infos = idx($attached, PhabricatorPHIDConstants::PHID_TYPE_FILE); + $file_phids = array_keys($file_infos); + + if ($file_phids) { + $files = id(new PhabricatorFile())->loadAllWhere( + 'phid IN (%Ls)', + $file_phids); + + $views = array(); + foreach ($files as $file) { + $view = new AphrontFilePreviewView(); + $view->setFile($file); + $views[] = $view->render(); + } + $dict['Files'] = implode('', $views); } - $rev_links = implode(', ', $rev_links); - $dict['Files'] = $rev_links; } diff --git a/src/applications/maniphest/controller/taskdetail/__init__.php b/src/applications/maniphest/controller/taskdetail/__init__.php index d9f4b18063..811e7c59df 100644 --- a/src/applications/maniphest/controller/taskdetail/__init__.php +++ b/src/applications/maniphest/controller/taskdetail/__init__.php @@ -9,6 +9,7 @@ phutil_require_module('phabricator', 'aphront/response/404'); phutil_require_module('phabricator', 'applications/differential/parser/markup'); phutil_require_module('phabricator', 'applications/draft/storage/draft'); +phutil_require_module('phabricator', 'applications/files/storage/file'); phutil_require_module('phabricator', 'applications/maniphest/constants/priority'); phutil_require_module('phabricator', 'applications/maniphest/constants/status'); phutil_require_module('phabricator', 'applications/maniphest/constants/transactiontype'); @@ -27,6 +28,7 @@ phutil_require_module('phabricator', 'view/form/control/select'); phutil_require_module('phabricator', 'view/form/control/submit'); phutil_require_module('phabricator', 'view/form/control/textarea'); phutil_require_module('phabricator', 'view/form/control/tokenizer'); +phutil_require_module('phabricator', 'view/layout/filepreview'); phutil_require_module('phabricator', 'view/layout/headsup/action'); phutil_require_module('phabricator', 'view/layout/headsup/actionlist'); phutil_require_module('phabricator', 'view/layout/panel'); diff --git a/src/view/form/control/draganddropupload/AphrontFormDragAndDropUploadControl.php b/src/view/form/control/draganddropupload/AphrontFormDragAndDropUploadControl.php index ede69d94d4..61976aed4d 100644 --- a/src/view/form/control/draganddropupload/AphrontFormDragAndDropUploadControl.php +++ b/src/view/form/control/draganddropupload/AphrontFormDragAndDropUploadControl.php @@ -47,13 +47,15 @@ class AphrontFormDragAndDropUploadControl extends AphrontFormControl { $files = $this->getValue(); $value = array(); - foreach ($files as $file) { - $view = new AphrontAttachedFileView(); - $view->setFile($file); - $value[$file->getPHID()] = array( - 'phid' => $file->getPHID(), - 'html' => $view->render(), - ); + if ($files) { + foreach ($files as $file) { + $view = new AphrontAttachedFileView(); + $view->setFile($file); + $value[$file->getPHID()] = array( + 'phid' => $file->getPHID(), + 'html' => $view->render(), + ); + } } Javelin::initBehavior( diff --git a/src/view/layout/filepreview/AphrontFilePreviewView.php b/src/view/layout/filepreview/AphrontFilePreviewView.php new file mode 100644 index 0000000000..c465fd9ac7 --- /dev/null +++ b/src/view/layout/filepreview/AphrontFilePreviewView.php @@ -0,0 +1,57 @@ +file = $file; + return $this; + } + + public function render() { + require_celerity_resource('aphront-attached-file-view-css'); + + $file = $this->file; + + $img = phutil_render_tag( + 'img', + array( + 'src' => $file->getThumb160x120URI(), + 'width' => 160, + 'height' => 120, + )); + $link = phutil_render_tag( + 'a', + array( + 'href' => $file->getViewURI(), + 'target' => '_blank', + ), + $img); + + return + '
+
'. + $link. + '
'. + phutil_escape_html($file->getName()). + '
'; + } + +} diff --git a/src/view/layout/filepreview/__init__.php b/src/view/layout/filepreview/__init__.php new file mode 100644 index 0000000000..7a0e14e8b0 --- /dev/null +++ b/src/view/layout/filepreview/__init__.php @@ -0,0 +1,15 @@ +