Move "Macros" to a first-class application
Summary: This is mostly to unblock D3547. - Move "Macros" to a first-class application called "Macros". - After D3547, this application will also house "Memes" (macros with text on them). - This will also make them easier to find; the top navigational query I field is "where are image macros?" nowadays, since it's not intuitive they're part of files. - This makes some of the UI mobile-aware but doesn't set the `device` flag yet, since there are still some missing pieces. - I'll separate storage out and continue modernizing the UI as we unblock and integrate D3547. Test Plan: Created, edited and deleted macros. Viewed files. Reviewers: btrahan, vrana, teisenbe Reviewed By: vrana CC: aran Maniphest Tasks: T175 Differential Revision: https://secure.phabricator.com/D3572
This commit is contained in:
@@ -0,0 +1,154 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2012 Facebook, Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
final class PhabricatorMacroListController
|
||||
extends PhabricatorMacroController {
|
||||
|
||||
public function processRequest() {
|
||||
|
||||
$request = $this->getRequest();
|
||||
|
||||
$macro_table = new PhabricatorFileImageMacro();
|
||||
if ($request->getStr('name') !== null) {
|
||||
$macros = $macro_table->loadAllWhere(
|
||||
'name LIKE %~',
|
||||
$request->getStr('name'));
|
||||
} else {
|
||||
$pager = new AphrontPagerView();
|
||||
$pager->setOffset($request->getInt('page'));
|
||||
|
||||
$macros = $macro_table->loadAllWhere(
|
||||
'1 = 1 ORDER BY id DESC LIMIT %d, %d',
|
||||
$pager->getOffset(),
|
||||
$pager->getPageSize());
|
||||
|
||||
// Get an exact count since the size here is reasonably going to be a few
|
||||
// thousand at most in any reasonable case.
|
||||
$count = queryfx_one(
|
||||
$macro_table->establishConnection('r'),
|
||||
'SELECT COUNT(*) N FROM %T',
|
||||
$macro_table->getTableName());
|
||||
$count = $count['N'];
|
||||
|
||||
$pager->setCount($count);
|
||||
$pager->setURI($request->getRequestURI(), 'page');
|
||||
}
|
||||
|
||||
$file_phids = mpull($macros, 'getFilePHID');
|
||||
|
||||
$files = array();
|
||||
if ($file_phids) {
|
||||
$files = id(new PhabricatorFile())->loadAllWhere(
|
||||
"phid IN (%Ls)",
|
||||
$file_phids);
|
||||
$author_phids = mpull($files, 'getAuthorPHID', 'getPHID');
|
||||
$handles = $this->loadViewerHandles($author_phids);
|
||||
}
|
||||
$files_map = mpull($files, null, 'getPHID');
|
||||
|
||||
$rows = array();
|
||||
foreach ($macros as $macro) {
|
||||
$file_phid = $macro->getFilePHID();
|
||||
$file = idx($files_map, $file_phid);
|
||||
|
||||
$author_link = isset($author_phids[$file_phid])
|
||||
? $handles[$author_phids[$file_phid]]->renderLink()
|
||||
: null;
|
||||
|
||||
$rows[] = array(
|
||||
phutil_render_tag(
|
||||
'a',
|
||||
array(
|
||||
'href' => $this->getApplicationURI('/edit/'.$macro->getID().'/'),
|
||||
),
|
||||
phutil_escape_html($macro->getName())),
|
||||
|
||||
$author_link,
|
||||
phutil_render_tag(
|
||||
'a',
|
||||
array(
|
||||
'href' => $file ? $file->getBestURI() : null,
|
||||
'target' => '_blank',
|
||||
),
|
||||
phutil_render_tag(
|
||||
'img',
|
||||
array(
|
||||
'src' => $file ? $file->getBestURI() : null,
|
||||
))),
|
||||
javelin_render_tag(
|
||||
'a',
|
||||
array(
|
||||
'href' => $this->getApplicationURI('/delete/'.$macro->getID().'/'),
|
||||
'sigil' => 'workflow',
|
||||
'class' => 'grey small button',
|
||||
),
|
||||
'Delete'),
|
||||
);
|
||||
}
|
||||
|
||||
$table = new AphrontTableView($rows);
|
||||
$table->setHeaders(
|
||||
array(
|
||||
'Name',
|
||||
'Author',
|
||||
'Image',
|
||||
'',
|
||||
));
|
||||
$table->setColumnClasses(
|
||||
array(
|
||||
'pri',
|
||||
'',
|
||||
'wide thumb',
|
||||
'action',
|
||||
));
|
||||
|
||||
$filter_form = id(new AphrontFormView())
|
||||
->setMethod('GET')
|
||||
->setUser($request->getUser())
|
||||
->appendChild(
|
||||
id(new AphrontFormTextControl())
|
||||
->setName('name')
|
||||
->setLabel('Name')
|
||||
->setValue($request->getStr('name')))
|
||||
->appendChild(
|
||||
id(new AphrontFormSubmitControl())
|
||||
->setValue('Filter Image Macros'));
|
||||
|
||||
$filter_view = new AphrontListFilterView();
|
||||
$filter_view->appendChild($filter_form);
|
||||
|
||||
$panel = new AphrontPanelView();
|
||||
$panel->appendChild($table);
|
||||
$panel->setHeader('Image Macros');
|
||||
if ($request->getStr('name') === null) {
|
||||
$panel->appendChild($pager);
|
||||
}
|
||||
|
||||
$nav = $this->buildSideNavView();
|
||||
$nav->selectFilter('/');
|
||||
|
||||
$nav->appendChild($filter_view);
|
||||
$nav->appendChild($panel);
|
||||
|
||||
return $this->buildApplicationPage(
|
||||
$nav,
|
||||
array(
|
||||
'title' => 'Image Macros',
|
||||
));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user