Differential D18116 Diff 43579 src/applications/diffusion/controller/DiffusionRepositoryProfilePictureController.php
Changeset View
Changeset View
Standalone View
Standalone View
src/applications/diffusion/controller/DiffusionRepositoryProfilePictureController.php
- This file was added.
<?php | |||||
final class DiffusionRepositoryProfilePictureController | |||||
extends DiffusionController { | |||||
public function handleRequest(AphrontRequest $request) { | |||||
$viewer = $this->getViewer(); | |||||
$id = $request->getURIData('id'); | |||||
$repository = id(new PhabricatorRepositoryQuery()) | |||||
->setViewer($viewer) | |||||
->withIDs(array($id)) | |||||
->needProfileImage(true) | |||||
->needURIs(true) | |||||
->requireCapabilities( | |||||
array( | |||||
PhabricatorPolicyCapability::CAN_VIEW, | |||||
PhabricatorPolicyCapability::CAN_EDIT, | |||||
)) | |||||
->executeOne(); | |||||
if (!$repository) { | |||||
return new Aphront404Response(); | |||||
} | |||||
$supported_formats = PhabricatorFile::getTransformableImageFormats(); | |||||
$e_file = true; | |||||
$errors = array(); | |||||
$done_uri = $repository->getURI(); | |||||
if ($request->isFormPost()) { | |||||
$phid = $request->getStr('phid'); | |||||
$is_default = false; | |||||
if ($phid == PhabricatorPHIDConstants::PHID_VOID) { | |||||
$phid = null; | |||||
$is_default = true; | |||||
} else if ($phid) { | |||||
$file = id(new PhabricatorFileQuery()) | |||||
->setViewer($viewer) | |||||
->withPHIDs(array($phid)) | |||||
->executeOne(); | |||||
} else { | |||||
if ($request->getFileExists('picture')) { | |||||
$file = PhabricatorFile::newFromPHPUpload( | |||||
$_FILES['picture'], | |||||
array( | |||||
'authorPHID' => $viewer->getPHID(), | |||||
'canCDN' => true, | |||||
)); | |||||
} else { | |||||
$e_file = pht('Required'); | |||||
$errors[] = pht( | |||||
'You must choose a file when uploading a new profile picture.'); | |||||
} | |||||
} | |||||
if (!$errors && !$is_default) { | |||||
if (!$file->isTransformableImage()) { | |||||
$e_file = pht('Not Supported'); | |||||
$errors[] = pht( | |||||
'This server only supports these image formats: %s.', | |||||
implode(', ', $supported_formats)); | |||||
} else { | |||||
$xform = PhabricatorFileTransform::getTransformByKey( | |||||
PhabricatorFileThumbnailTransform::TRANSFORM_PROFILE); | |||||
$xformed = $xform->executeTransform($file); | |||||
} | |||||
} | |||||
if (!$errors) { | |||||
if ($is_default) { | |||||
$repository->setProfileImagePHID(null); | |||||
} else { | |||||
$repository->setProfileImagePHID($xformed->getPHID()); | |||||
$xformed->attachToObject($repository->getPHID()); | |||||
} | |||||
$repository->save(); | |||||
return id(new AphrontRedirectResponse())->setURI($done_uri); | |||||
} | |||||
} | |||||
$title = pht('Edit Picture'); | |||||
$form = id(new PHUIFormLayoutView()) | |||||
->setUser($viewer); | |||||
$default_image = PhabricatorFile::loadBuiltin( | |||||
$viewer, 'repo/code.png'); | |||||
$images = array(); | |||||
$current = $repository->getProfileImagePHID(); | |||||
$has_current = false; | |||||
if ($current) { | |||||
$files = id(new PhabricatorFileQuery()) | |||||
->setViewer($viewer) | |||||
->withPHIDs(array($current)) | |||||
->execute(); | |||||
if ($files) { | |||||
$file = head($files); | |||||
if ($file->isTransformableImage()) { | |||||
$has_current = true; | |||||
$images[$current] = array( | |||||
'uri' => $file->getBestURI(), | |||||
'tip' => pht('Current Picture'), | |||||
); | |||||
} | |||||
} | |||||
} | |||||
$builtins = array( | |||||
'repo/commit.png', | |||||
'repo/database.png', | |||||
'repo/desktop.png', | |||||
'repo/gears.png', | |||||
'repo/globe.png', | |||||
'repo/locked.png', | |||||
'repo/microchip.png', | |||||
'repo/mobile.png', | |||||
'repo/repo.png', | |||||
'repo/servers.png', | |||||
); | |||||
foreach ($builtins as $builtin) { | |||||
$file = PhabricatorFile::loadBuiltin($viewer, $builtin); | |||||
$images[$file->getPHID()] = array( | |||||
'uri' => $file->getBestURI(), | |||||
'tip' => pht('Builtin Image'), | |||||
); | |||||
} | |||||
$images[PhabricatorPHIDConstants::PHID_VOID] = array( | |||||
'uri' => $default_image->getBestURI(), | |||||
'tip' => pht('Default Picture'), | |||||
); | |||||
require_celerity_resource('people-profile-css'); | |||||
Javelin::initBehavior('phabricator-tooltips', array()); | |||||
$buttons = array(); | |||||
foreach ($images as $phid => $spec) { | |||||
$style = null; | |||||
if (isset($spec['style'])) { | |||||
$style = $spec['style']; | |||||
} | |||||
$button = javelin_tag( | |||||
'button', | |||||
array( | |||||
'class' => 'button-grey profile-image-button', | |||||
'sigil' => 'has-tooltip', | |||||
'meta' => array( | |||||
'tip' => $spec['tip'], | |||||
'size' => 300, | |||||
), | |||||
), | |||||
phutil_tag( | |||||
'img', | |||||
array( | |||||
'height' => 50, | |||||
'width' => 50, | |||||
'src' => $spec['uri'], | |||||
))); | |||||
$button = array( | |||||
phutil_tag( | |||||
'input', | |||||
array( | |||||
'type' => 'hidden', | |||||
'name' => 'phid', | |||||
'value' => $phid, | |||||
)), | |||||
$button, | |||||
); | |||||
$button = phabricator_form( | |||||
$viewer, | |||||
array( | |||||
'class' => 'profile-image-form', | |||||
'method' => 'POST', | |||||
), | |||||
$button); | |||||
$buttons[] = $button; | |||||
} | |||||
if ($has_current) { | |||||
$form->appendChild( | |||||
id(new AphrontFormMarkupControl()) | |||||
->setLabel(pht('Current Picture')) | |||||
->setValue(array_shift($buttons))); | |||||
} | |||||
$form->appendChild( | |||||
id(new AphrontFormMarkupControl()) | |||||
->setLabel(pht('Use Picture')) | |||||
->setValue($buttons)); | |||||
$form_box = id(new PHUIObjectBoxView()) | |||||
->setHeaderText($title) | |||||
->setFormErrors($errors) | |||||
->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) | |||||
->setForm($form); | |||||
$upload_form = id(new AphrontFormView()) | |||||
->setUser($viewer) | |||||
->setEncType('multipart/form-data') | |||||
->appendChild( | |||||
id(new AphrontFormFileControl()) | |||||
->setName('picture') | |||||
->setLabel(pht('Upload Picture')) | |||||
->setError($e_file) | |||||
->setCaption( | |||||
pht('Supported formats: %s', implode(', ', $supported_formats)))) | |||||
->appendChild( | |||||
id(new AphrontFormSubmitControl()) | |||||
->addCancelButton($done_uri) | |||||
->setValue(pht('Upload Picture'))); | |||||
$header = id(new PHUIHeaderView()) | |||||
->setHeader(pht('Edit Repository Picture')) | |||||
->setHeaderIcon('fa-camera-retro'); | |||||
$crumbs = $this->buildApplicationCrumbs(); | |||||
$crumbs->addTextCrumb($repository->getName(), $repository->getURI()); | |||||
$crumbs->addTextCrumb(pht('Edit Picture')); | |||||
$crumbs->setBorder(true); | |||||
$upload_box = id(new PHUIObjectBoxView()) | |||||
->setHeaderText(pht('Upload New Picture')) | |||||
->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) | |||||
->setForm($upload_form); | |||||
$view = id(new PHUITwoColumnView()) | |||||
->setHeader($header) | |||||
->setFooter(array( | |||||
$form_box, | |||||
$upload_box, | |||||
)); | |||||
return $this->newPage() | |||||
->setTitle($title) | |||||
->setCrumbs($crumbs) | |||||
->appendChild($view); | |||||
} | |||||
} |