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:
@@ -1891,7 +1891,7 @@ celerity_register_resource_map(array(
|
|||||||
),
|
),
|
||||||
'javelin-behavior-pholio-mock-view' =>
|
'javelin-behavior-pholio-mock-view' =>
|
||||||
array(
|
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',
|
'type' => 'js',
|
||||||
'requires' =>
|
'requires' =>
|
||||||
array(
|
array(
|
||||||
@@ -1902,7 +1902,8 @@ celerity_register_resource_map(array(
|
|||||||
4 => 'javelin-vector',
|
4 => 'javelin-vector',
|
||||||
5 => 'javelin-magical-init',
|
5 => 'javelin-magical-init',
|
||||||
6 => 'javelin-request',
|
6 => 'javelin-request',
|
||||||
7 => 'phabricator-keyboard-shortcut',
|
7 => 'javelin-history',
|
||||||
|
8 => 'phabricator-keyboard-shortcut',
|
||||||
),
|
),
|
||||||
'disk' => '/rsrc/js/application/pholio/behavior-pholio-mock-view.js',
|
'disk' => '/rsrc/js/application/pholio/behavior-pholio-mock-view.js',
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ final class PhabricatorApplicationPholio extends PhabricatorApplication {
|
|||||||
|
|
||||||
public function getRoutes() {
|
public function getRoutes() {
|
||||||
return array(
|
return array(
|
||||||
'/M(?P<id>[1-9]\d*)' => 'PholioMockViewController',
|
'/M(?P<id>[1-9]\d*)(?:/(?P<imageID>\d+)/)?' => 'PholioMockViewController',
|
||||||
'/pholio/' => array(
|
'/pholio/' => array(
|
||||||
'' => 'PholioMockListController',
|
'' => 'PholioMockListController',
|
||||||
'view/(?P<view>\w+)/' => 'PholioMockListController',
|
'view/(?P<view>\w+)/' => 'PholioMockListController',
|
||||||
|
|||||||
@@ -6,9 +6,11 @@
|
|||||||
final class PholioMockViewController extends PholioController {
|
final class PholioMockViewController extends PholioController {
|
||||||
|
|
||||||
private $id;
|
private $id;
|
||||||
|
private $imageID;
|
||||||
|
|
||||||
public function willProcessRequest(array $data) {
|
public function willProcessRequest(array $data) {
|
||||||
$this->id = $data['id'];
|
$this->id = $data['id'];
|
||||||
|
$this->imageID = idx($data, 'imageID');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function processRequest() {
|
public function processRequest() {
|
||||||
@@ -67,6 +69,7 @@ final class PholioMockViewController extends PholioController {
|
|||||||
|
|
||||||
$output = new PholioMockImagesView();
|
$output = new PholioMockImagesView();
|
||||||
$output->setMock($mock);
|
$output->setMock($mock);
|
||||||
|
$output->setImageID($this->imageID);
|
||||||
|
|
||||||
$xaction_view = id(new PhabricatorApplicationTransactionView())
|
$xaction_view = id(new PhabricatorApplicationTransactionView())
|
||||||
->setUser($this->getRequest()->getUser())
|
->setUser($this->getRequest()->getUser())
|
||||||
|
|||||||
@@ -3,6 +3,16 @@
|
|||||||
final class PholioMockImagesView extends AphrontView {
|
final class PholioMockImagesView extends AphrontView {
|
||||||
|
|
||||||
private $mock;
|
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) {
|
public function setMock(PholioMock $mock) {
|
||||||
$this->mock = $mock;
|
$this->mock = $mock;
|
||||||
@@ -22,10 +32,18 @@ final class PholioMockImagesView extends AphrontView {
|
|||||||
$panel_id = celerity_generate_unique_node_id();
|
$panel_id = celerity_generate_unique_node_id();
|
||||||
$viewport_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) {
|
foreach ($mock->getImages() as $image) {
|
||||||
$images[] = array(
|
$images[] = array(
|
||||||
'id' => $image->getID(),
|
'id' => $image->getID(),
|
||||||
'fullURI' => $image->getFile()->getBestURI(),
|
'fullURI' => $image->getFile()->getBestURI(),
|
||||||
|
'pageURI' => '/M'.$mock->getID().'/'.$image->getID().'/',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -34,7 +52,7 @@ final class PholioMockImagesView extends AphrontView {
|
|||||||
'panelID' => $panel_id,
|
'panelID' => $panel_id,
|
||||||
'viewportID' => $viewport_id,
|
'viewportID' => $viewport_id,
|
||||||
'images' => $images,
|
'images' => $images,
|
||||||
|
'selectedID' => $selected_id,
|
||||||
);
|
);
|
||||||
Javelin::initBehavior('pholio-mock-view', $config);
|
Javelin::initBehavior('pholio-mock-view', $config);
|
||||||
|
|
||||||
@@ -87,10 +105,11 @@ final class PholioMockImagesView extends AphrontView {
|
|||||||
));
|
));
|
||||||
|
|
||||||
$thumbnails[] = javelin_tag(
|
$thumbnails[] = javelin_tag(
|
||||||
'div',
|
'a',
|
||||||
array(
|
array(
|
||||||
'sigil' => 'mock-thumbnail',
|
'sigil' => 'mock-thumbnail',
|
||||||
'class' => 'pholio-mock-carousel-thumb-item',
|
'class' => 'pholio-mock-carousel-thumb-item',
|
||||||
|
'href' => '/M'.$mock->getID().'/'.$image->getID().'/',
|
||||||
'meta' => array(
|
'meta' => array(
|
||||||
'imageID' => $image->getID(),
|
'imageID' => $image->getID(),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
* javelin-vector
|
* javelin-vector
|
||||||
* javelin-magical-init
|
* javelin-magical-init
|
||||||
* javelin-request
|
* javelin-request
|
||||||
|
* javelin-history
|
||||||
* phabricator-keyboard-shortcut
|
* phabricator-keyboard-shortcut
|
||||||
*/
|
*/
|
||||||
JX.behavior('pholio-mock-view', function(config) {
|
JX.behavior('pholio-mock-view', function(config) {
|
||||||
@@ -175,6 +176,10 @@ JX.behavior('pholio-mock-view', function(config) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
load_inline_comments();
|
load_inline_comments();
|
||||||
|
|
||||||
|
if (image_id != config.selectedID) {
|
||||||
|
JX.History.replace(active_image.pageURI);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
JX.Stratcom.listen(
|
JX.Stratcom.listen(
|
||||||
@@ -188,8 +193,7 @@ JX.behavior('pholio-mock-view', function(config) {
|
|||||||
select_image(e.getNodeData('mock-thumbnail').imageID);
|
select_image(e.getNodeData('mock-thumbnail').imageID);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Select and show the first image.
|
select_image(config.selectedID);
|
||||||
select_image(config.images[0].id);
|
|
||||||
|
|
||||||
JX.Stratcom.listen('mousedown', 'mock-panel', function(e) {
|
JX.Stratcom.listen('mousedown', 'mock-panel', function(e) {
|
||||||
if (!e.isNormalMouseEvent()) {
|
if (!e.isNormalMouseEvent()) {
|
||||||
|
|||||||
Reference in New Issue
Block a user