Make Pholio URIs aware of which image you are looking at

Summary: Fixes T2658. Map `/Mxx/yy/` to images in a mock. Use HTML5 history stuff to make it work nicely. This also makes right-click-open-in-new-tab work correctly.

Test Plan: Clicked thumbs in a mock. Right-clicked thumbs. Copy and pasted a URI. Used browser back button.

Reviewers: chad

Reviewed By: chad

CC: aran

Maniphest Tasks: T2658

Differential Revision: https://secure.phabricator.com/D5222
This commit is contained in:
epriestley
2013-03-04 18:43:29 -08:00
parent 7a8b4a21ab
commit 1bb160a244
5 changed files with 34 additions and 7 deletions

View File

@@ -1891,7 +1891,7 @@ celerity_register_resource_map(array(
),
'javelin-behavior-pholio-mock-view' =>
array(
'uri' => '/res/d993bd2b/rsrc/js/application/pholio/behavior-pholio-mock-view.js',
'uri' => '/res/e9e31577/rsrc/js/application/pholio/behavior-pholio-mock-view.js',
'type' => 'js',
'requires' =>
array(
@@ -1902,7 +1902,8 @@ celerity_register_resource_map(array(
4 => 'javelin-vector',
5 => 'javelin-magical-init',
6 => 'javelin-request',
7 => 'phabricator-keyboard-shortcut',
7 => 'javelin-history',
8 => 'phabricator-keyboard-shortcut',
),
'disk' => '/rsrc/js/application/pholio/behavior-pholio-mock-view.js',
),

View File

@@ -42,7 +42,7 @@ final class PhabricatorApplicationPholio extends PhabricatorApplication {
public function getRoutes() {
return array(
'/M(?P<id>[1-9]\d*)' => 'PholioMockViewController',
'/M(?P<id>[1-9]\d*)(?:/(?P<imageID>\d+)/)?' => 'PholioMockViewController',
'/pholio/' => array(
'' => 'PholioMockListController',
'view/(?P<view>\w+)/' => 'PholioMockListController',

View File

@@ -6,9 +6,11 @@
final class PholioMockViewController extends PholioController {
private $id;
private $imageID;
public function willProcessRequest(array $data) {
$this->id = $data['id'];
$this->imageID = idx($data, 'imageID');
}
public function processRequest() {
@@ -67,6 +69,7 @@ final class PholioMockViewController extends PholioController {
$output = new PholioMockImagesView();
$output->setMock($mock);
$output->setImageID($this->imageID);
$xaction_view = id(new PhabricatorApplicationTransactionView())
->setUser($this->getRequest()->getUser())

View File

@@ -3,6 +3,16 @@
final class PholioMockImagesView extends AphrontView {
private $mock;
private $imageID;
public function setImageID($image_id) {
$this->imageID = $image_id;
return $this;
}
public function getImageID() {
return $this->imageID;
}
public function setMock(PholioMock $mock) {
$this->mock = $mock;
@@ -22,10 +32,18 @@ final class PholioMockImagesView extends AphrontView {
$panel_id = celerity_generate_unique_node_id();
$viewport_id = celerity_generate_unique_node_id();
$ids = mpull($mock->getImages(), 'getID');
if ($this->imageID && isset($ids[$this->imageID])) {
$selected_id = $this->imageID;
} else {
$selected_id = head_key($ids);
}
foreach ($mock->getImages() as $image) {
$images[] = array(
'id' => $image->getID(),
'fullURI' => $image->getFile()->getBestURI(),
'pageURI' => '/M'.$mock->getID().'/'.$image->getID().'/',
);
}
@@ -34,7 +52,7 @@ final class PholioMockImagesView extends AphrontView {
'panelID' => $panel_id,
'viewportID' => $viewport_id,
'images' => $images,
'selectedID' => $selected_id,
);
Javelin::initBehavior('pholio-mock-view', $config);
@@ -87,10 +105,11 @@ final class PholioMockImagesView extends AphrontView {
));
$thumbnails[] = javelin_tag(
'div',
'a',
array(
'sigil' => 'mock-thumbnail',
'class' => 'pholio-mock-carousel-thumb-item',
'href' => '/M'.$mock->getID().'/'.$image->getID().'/',
'meta' => array(
'imageID' => $image->getID(),
),