mirror of
https://github.com/phpbb/phpbb.git
synced 2025-06-29 14:48:53 +00:00
[ticket/13713] Introduce priorities based sorting
PHPBB3-13713
This commit is contained in:
parent
6d849f2cce
commit
d195244004
4 changed files with 82 additions and 9 deletions
|
@ -386,21 +386,24 @@ function getCaretPosition(txtarea) {
|
|||
|
||||
(function($) {
|
||||
function Mentions() {
|
||||
let $mentionDataContainer = $('[data-mention-url]:first'), cachedNames = null, filteredNamesCount = 0;
|
||||
|
||||
function defaultAvatar(type) {
|
||||
return (type === 'group') ? '<svg class="mention-media-avatar" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path fill-rule="evenodd" d="M16 11c1.66 0 2.99-1.34 2.99-3S17.66 5 16 5c-1.66 0-3 1.34-3 3s1.34 3 3 3zm-8 0c1.66 0 2.99-1.34 2.99-3S9.66 5 8 5C6.34 5 5 6.34 5 8s1.34 3 3 3zm0 2c-2.33 0-7 1.17-7 3.5V19h14v-2.5c0-2.33-4.67-3.5-7-3.5zm8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45V19h6v-2.5c0-2.33-4.67-3.5-7-3.5z"/></svg>' : '<svg class="mention-media-avatar" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path fill-rule="evenodd" d="M12,19.2C9.5,19.2 7.29,17.92 6,16C6.03,14 10,12.9 12,12.9C14,12.9 17.97,14 18,16C16.71,17.92 14.5,19.2 12,19.2M12,5A3,3 0 0,1 15,8A3,3 0 0,1 12,11A3,3 0 0,1 9,8A3,3 0 0,1 12,5M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12C22,6.47 17.5,2 12,2Z"/></svg>';
|
||||
}
|
||||
|
||||
this.isEnabled = function() {
|
||||
return $('[data-mention-url]').length;
|
||||
return $mentionDataContainer.length;
|
||||
};
|
||||
|
||||
this.handle = function(txtarea) {
|
||||
let $mentionDataContainer = $('[data-mention-url]'),
|
||||
mentionURL = $mentionDataContainer.data('mentionUrl'),
|
||||
let mentionURL = $mentionDataContainer.data('mentionUrl'),
|
||||
mentionNamesLimit = $mentionDataContainer.data('mentionNamesLimit'),
|
||||
mentionTopicId = $mentionDataContainer.data('topicId');
|
||||
mentionTopicId = $mentionDataContainer.data('topicId'),
|
||||
defaultFilter = $.fn.atwho['default'].callbacks.filter;
|
||||
$(txtarea).atwho({
|
||||
at: "@",
|
||||
acceptSpaceBar: true,
|
||||
displayTpl: function(data) {
|
||||
// TODO: handle image scaling
|
||||
let avatar = (data.avatar.img) ? "<span class='mention-media-avatar'>" + data.avatar.img + "</span>" : defaultAvatar(data.avatar.type),
|
||||
|
@ -410,11 +413,66 @@ function getCaretPosition(txtarea) {
|
|||
insertTpl: "[mention=${type}:${id}]${name}[/mention]",
|
||||
limit: mentionNamesLimit,
|
||||
callbacks: {
|
||||
filter: function(query, data, searchKey) {
|
||||
data = defaultFilter(query, data, searchKey);
|
||||
|
||||
// Update our cached statistics used by remoteFilter
|
||||
filteredNamesCount = data.length;
|
||||
|
||||
return data;
|
||||
},
|
||||
remoteFilter: function(query, callback) {
|
||||
if (cachedNames && filteredNamesCount >= mentionNamesLimit) {
|
||||
callback(cachedNames);
|
||||
return;
|
||||
}
|
||||
let params = {keyword: query, topic_id: mentionTopicId, _referer: location.href};
|
||||
$.getJSON(mentionURL, params, function (data) {
|
||||
callback(data)
|
||||
cachedNames = data;
|
||||
callback(data);
|
||||
});
|
||||
},
|
||||
sorter: function(query, items, searchKey) {
|
||||
let _unsorted, _results, _exactMatch, i, item, len, highestPriority = 0;
|
||||
_unsorted = {u: {}, g: {}};
|
||||
_exactMatch = [];
|
||||
for (i = 0, len = items.length; i < len; i++) {
|
||||
item = items[i];
|
||||
if (item.name === query) {
|
||||
_exactMatch.push(items[i]);
|
||||
continue;
|
||||
}
|
||||
if (!_unsorted[item.type]) {
|
||||
continue;
|
||||
}
|
||||
if (!_unsorted[item.type][item.id] || item.type === 'g') {
|
||||
_unsorted[item.type][item.id] = item;
|
||||
continue;
|
||||
}
|
||||
_unsorted[item.type][item.id].priority += parseFloat(item.priority);
|
||||
highestPriority = Math.max(highestPriority, _unsorted[item.type][item.id].priority);
|
||||
}
|
||||
_results = [];
|
||||
if (_unsorted['u']) {
|
||||
$.each(_unsorted['u'], function(name, value) {
|
||||
_results.push(value);
|
||||
});
|
||||
}
|
||||
if (_unsorted['g']) {
|
||||
$.each(_unsorted['g'], function(name, value) {
|
||||
// Groups should come at the same level of importance
|
||||
// as users, otherwise they will be unlikely to be shown
|
||||
value.priority = highestPriority;
|
||||
_results.push(value);
|
||||
});
|
||||
}
|
||||
_results = _results.sort(function(a, b) {
|
||||
return a.priority - b.priority;
|
||||
});
|
||||
$.each(_exactMatch, function(name, value) {
|
||||
_results.unshift(value);
|
||||
});
|
||||
return _results;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
@ -54,7 +54,7 @@ class mention
|
|||
|
||||
foreach ($this->mention_sources as $source)
|
||||
{
|
||||
$names = array_merge($names, $source->get($keyword, $topic_id));
|
||||
$names += $source->get($keyword, $topic_id);
|
||||
}
|
||||
|
||||
return new JsonResponse(array_values($names));
|
||||
|
|
|
@ -131,7 +131,7 @@ abstract class base_group implements source_interface
|
|||
foreach ($group_ids as $group_id)
|
||||
{
|
||||
$group_rank = phpbb_get_user_rank($groups[$group_id], false);
|
||||
$names['g' . $group_id] = [
|
||||
$names[] = [
|
||||
'name' => $groups[$group_id]['group_name'],
|
||||
'type' => 'g',
|
||||
'id' => $group_id,
|
||||
|
|
|
@ -15,6 +15,9 @@ namespace phpbb\mention\source;
|
|||
|
||||
abstract class base_user implements source_interface
|
||||
{
|
||||
/** @var int */
|
||||
const NAMES_BATCH_SIZE = 100;
|
||||
|
||||
/** @var \phpbb\db\driver\driver_interface */
|
||||
protected $db;
|
||||
|
||||
|
@ -56,19 +59,30 @@ abstract class base_user implements source_interface
|
|||
*/
|
||||
abstract protected function query($keyword, $topic_id);
|
||||
|
||||
/**
|
||||
* Returns the priority of the currently selected name
|
||||
*
|
||||
* @param array $row Array of fetched user data
|
||||
* @return int Priority (defaults to 1)
|
||||
*/
|
||||
public function get_priority($row)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function get($keyword, $topic_id)
|
||||
{
|
||||
$keyword = utf8_clean_string($keyword);
|
||||
$result = $this->db->sql_query_limit($this->query($keyword, $topic_id), $this->config['mention_names_limit']);
|
||||
$result = $this->db->sql_query_limit($this->query($keyword, $topic_id), self::NAMES_BATCH_SIZE);
|
||||
|
||||
$names = [];
|
||||
while ($row = $this->db->sql_fetchrow($result))
|
||||
{
|
||||
$user_rank = $this->user_loader->get_rank($row['user_id'], true);
|
||||
$names['u' . $row['user_id']] = [
|
||||
$names[] = [
|
||||
'name' => $row['username'],
|
||||
'type' => 'u',
|
||||
'id' => $row['user_id'],
|
||||
|
@ -77,6 +91,7 @@ abstract class base_user implements source_interface
|
|||
'img' => $this->user_loader->get_avatar($row['user_id'], true),
|
||||
],
|
||||
'rank' => (isset($user_rank['rank_title'])) ? $user_rank['rank_title'] : '',
|
||||
'priority' => $this->get_priority($row),
|
||||
];
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue