Introducing tag list sort styles

Also, increased margin in /users
This commit is contained in:
Marcin Kurczewski 2013-11-22 00:17:57 +01:00
parent 007e797d3a
commit 0bbeb4604f
8 changed files with 113 additions and 26 deletions

View file

@ -47,3 +47,19 @@ form h1 {
.frequency8 { color: #be4343; } .frequency8 { color: #be4343; }
.frequency9 { color: #b83333; } .frequency9 { color: #b83333; }
.frequency10 { color: #b22222; } .frequency10 { color: #b22222; }
nav.sort-styles ul {
list-style-type: none;
margin: 0 0 2.5em 0;
text-align: center;
padding: 0;
}
nav.sort-styles li {
display: inline-block;
font-size: 105%;
margin: 0 1em;
padding-bottom: 0.2em;
}
nav.sort-styles li.active {
border-bottom: 3px solid firebrick;
}

View file

@ -24,7 +24,7 @@
nav.sort-styles ul { nav.sort-styles ul {
list-style-type: none; list-style-type: none;
margin: 0 0 1em 0; margin: 0 0 2.5em 0;
text-align: center; text-align: center;
padding: 0; padding: 0;
} }

View file

@ -178,9 +178,9 @@ $(function()
{ {
var term = extractLast(request.term); var term = extractLast(request.term);
if (term != '') if (term != '')
$.get(searchInput.attr('data-autocomplete-url') + '?json', {filter: term}, function(data) $.get(searchInput.attr('data-autocomplete-url') + '?json', {filter: term + ' order:popularity,desc'}, function(data)
{ {
response($.map(data.tags, function(tag) { return { label: tag.name, value: tag.name }; })); response($.map(data.tags, function(tag) { return { label: tag.name + ' (' + tag.count + ')', value: tag.name }; }));
}); });
}, },
focus: function() focus: function()

View file

@ -10,7 +10,7 @@ function onDomUpdate()
aDom.addClass('inactive'); aDom.addClass('inactive');
var tags = []; var tags = [];
$.getJSON('/tags?json', function(data) $.getJSON('/tags?json', {filter: 'order:popularity,desc'}, function(data)
{ {
aDom.removeClass('inactive'); aDom.removeClass('inactive');
var formDom = $('form.edit-post'); var formDom = $('form.edit-post');

View file

@ -11,7 +11,7 @@ $(function()
}); });
var tags = []; var tags = [];
$.getJSON('/tags?json', function(data) $.getJSON('/tags?json', {filter: 'order:popularity,desc'}, function(data)
{ {
tags = data['tags']; tags = data['tags'];
}); });

View file

@ -3,8 +3,10 @@ class TagController
{ {
/** /**
* @route /tags * @route /tags
* @route /tags/{filter}
* @validate filter [a-zA-Z\32:,_-]+
*/ */
public function listAction() public function listAction($filter = null)
{ {
$this->context->stylesheets []= 'tag-list.css'; $this->context->stylesheets []= 'tag-list.css';
$this->context->stylesheets []= 'tabs.css'; $this->context->stylesheets []= 'tabs.css';
@ -12,9 +14,10 @@ class TagController
$this->context->viewName = 'tag-list-wrapper'; $this->context->viewName = 'tag-list-wrapper';
PrivilegesHelper::confirmWithException(Privilege::ListTags); PrivilegesHelper::confirmWithException(Privilege::ListTags);
$suppliedFilter = InputHelper::get('filter'); $suppliedFilter = $filter ?: InputHelper::get('filter') ?: 'order:alpha,asc';
$tags = Model_Tag::getEntitiesRows($suppliedFilter, null, null); $tags = Model_Tag::getEntitiesRows($suppliedFilter, null, null);
$this->context->filter = $suppliedFilter;
$this->context->transport->tags = $tags; $this->context->transport->tags = $tags;
if ($this->context->json) if ($this->context->json)
@ -22,20 +25,11 @@ class TagController
$this->context->transport->tags = array_values(array_map(function($tag) { $this->context->transport->tags = array_values(array_map(function($tag) {
return ['name' => $tag['name'], 'count' => $tag['post_count']]; return ['name' => $tag['name'], 'count' => $tag['post_count']];
}, $this->context->transport->tags)); }, $this->context->transport->tags));
usort($this->context->transport->tags, function($a, $b) {
return $a['count'] > $b['count'] ? -1 : 1;
});
}
else
{
uasort($this->context->transport->tags, function($a, $b) {
return strnatcasecmp($a['name'], $b['name']);
});
} }
} }
/** /**
* @route /tags/merge * @route /tag/merge
*/ */
public function mergeAction() public function mergeAction()
{ {
@ -77,7 +71,7 @@ class TagController
} }
/** /**
* @route /tags/rename * @route /tag/rename
*/ */
public function renameAction() public function renameAction()
{ {

View file

@ -17,21 +17,71 @@ class model_Tag_QueryBuilder implements AbstractQueryBuilder
foreach ($allowedSafety as $s) foreach ($allowedSafety as $s)
$dbQuery->put($s); $dbQuery->put($s);
$orderToken = null;
if ($query !== null) if ($query !== null)
{
$tokens = preg_split('/\s+/', $query);
foreach ($tokens as $token)
{
if (strpos($token, ':') !== false)
{
list ($key, $value) = explode(':', $token);
if ($key == 'order')
$orderToken = $value;
else
throw new SimpleException('Unknown key: ' . $key);
}
else
{ {
$limitQuery = true; $limitQuery = true;
if (strlen($query) >= 3) if (strlen($token) >= 3)
$query = '%' . $query; $token = '%' . $token;
$query .= '%'; $token .= '%';
$dbQuery $dbQuery
->and('LOWER(tag.name)') ->and('LOWER(tag.name)')
->like('LOWER(?)') ->like('LOWER(?)')
->put($query); ->put($token);
}
}
} }
$dbQuery->groupBy('tag.id'); $dbQuery->groupBy('tag.id');
if ($orderToken)
self::order($dbQuery,$orderToken);
if ($limitQuery) if ($limitQuery)
$dbQuery->limit(15); $dbQuery->limit(15);
} }
private static function order($dbQuery, $value)
{
if (strpos($value, ',') !== false)
{
list ($orderColumn, $orderDir) = explode(',', $value);
}
else
{
$orderColumn = $value;
$orderDir = 'asc';
}
switch ($orderColumn)
{
case 'popularity':
$dbQuery->orderBy('post_count');
break;
case 'alpha':
$dbQuery->orderBy('name');
break;
}
if ($orderDir == 'asc')
$dbQuery->asc();
else
$dbQuery->desc();
}
} }

View file

@ -1,3 +1,30 @@
<nav class="sort-styles">
<ul>
<?php
$sortStyles =
[
'order:alpha,asc' => 'Sort A&rarr;Z',
'order:alpha,desc' => 'Sort Z&rarr;A',
'order:popularity,desc' => 'Often used first',
'order:popularity,asc' => 'Rarely used first',
];
if ($this->config->registration->staffActivation)
$sortStyles['pending'] = 'Pending staff review';
?>
<?php foreach ($sortStyles as $key => $text): ?>
<?php if ($this->context->filter == $key): ?>
<li class="active">
<?php else: ?>
<li>
<?php endif ?>
<a href="<?php echo \Chibi\UrlHelper::route('tag', 'list', ['filter' => $key]) ?>"><?php echo $text ?></a>
</li>
<?php endforeach ?>
</ul>
</nav>
<?php $max = max([0]+array_map(function($x) { return $x['post_count']; }, $this->context->transport->tags)); ?> <?php $max = max([0]+array_map(function($x) { return $x['post_count']; }, $this->context->transport->tags)); ?>
<?php $add = 0. ?> <?php $add = 0. ?>
<?php $mul = 10. / max(1, log(max(1, $max))) ?> <?php $mul = 10. / max(1, log(max(1, $max))) ?>