bring filed items to mod hq

This commit is contained in:
Mario
2024-10-19 18:49:47 +00:00
parent e649ba5b13
commit 4d1be3aea5
5 changed files with 111 additions and 18 deletions

View File

@@ -230,6 +230,7 @@ class Hq extends \Zotlabs\Web\Controller {
$options['offset'] = $_REQUEST['offset'] ?? 0;
$options['type'] = $_REQUEST['type'] ?? '';
$options['author'] = ((isset($_REQUEST['author'])) ? urldecode($_REQUEST['author']) : '');
$options['file'] = ((isset($_REQUEST['file'])) ? urldecode($_REQUEST['file']) : '');
$ret = Messages::get_messages_page($options);

View File

@@ -23,20 +23,35 @@ class Messages {
$_SESSION['messages_loadtime'] = datetime_convert();
$r = q("SELECT DISTINCT(term) FROM term WHERE uid = %d AND ttype = %d ORDER BY term",
intval(local_channel()),
intval(TERM_FILE)
);
if ($r) {
foreach($r as $rr) {
$file_tags[] = $rr['term'];
}
}
$tpl = get_markup_template('messages_widget.tpl');
$o = replace_macros($tpl, [
'$entries' => $page['entries'] ?? [],
'$offset' => $page['offset'] ?? 0,
'$feature_star' => feature_enabled(local_channel(), 'star_posts'),
'$feature_file' => feature_enabled(local_channel(), 'filing'),
'$file_tags' => $file_tags,
'$strings' => [
'messages_title' => t('Public and restricted messages'),
'direct_messages_title' => t('Direct messages'),
'starred_messages_title' => t('Starred messages'),
'filed_messages_title' => t('Filed messages'),
'notice_messages_title' => t('Notices'),
'loading' => t('Loading'),
'empty' => t('No messages'),
'unseen_count' => t('Unseen'),
'filter' => t('Filter by name or address')
'filter' => t('Filter by name or address'),
'file_filter' => t('Filter by file name')
]
]);
@@ -50,6 +65,7 @@ class Messages {
$offset = $options['offset'] ?? 0;
$type = $options['type'] ?? '';
$author = $options['author'] ?? '';
$file = $options['file'] ?? '';
if ($offset == -1) {
return;
@@ -67,8 +83,9 @@ class Messages {
$item_normal_c = str_replace('item.', 'c.', $item_normal);
$entries = [];
$limit = 30;
$order_sql = 'i.created DESC';
$dummy_order_sql = '';
$author_sql = '';
$filter_sql = '';
$loadtime = (($offset) ? $_SESSION['messages_loadtime'] : datetime_convert());
$vnotify = get_pconfig(local_channel(), 'system', 'vnotify', -1);
@@ -84,43 +101,55 @@ class Messages {
$vnotify_sql_i = " AND i.verb NOT IN ('Dislike', '" . dbesc(ACTIVITY_DISLIKE) . "') ";
}
if($author) {
$author_sql = " AND (i.owner_xchan = '" . protect_sprintf(dbesc($author)) . "') ";
if($type !== 'filed' && $author) {
$filter_sql = " AND (i.owner_xchan = '" . protect_sprintf(dbesc($author)) . "') ";
}
if($type === 'filed' && $file) {
$filed_filter_sql = " AND (term.term = '" . protect_sprintf(dbesc($file)) . "') ";
}
switch($type) {
case 'direct':
$type_sql = ' AND i.item_private = 2 ';
$type_sql = ' AND i.item_private = 2 AND i.item_thread_top = 1 ';
// $dummy_order_sql has no other meaning but to trick
// some mysql backends into using the right index.
$dummy_order_sql = ', i.received DESC ';
break;
case 'starred':
$type_sql = ' AND i.item_starred = 1 ';
$type_sql = ' AND i.item_starred = 1 AND i.item_thread_top = 1 ';
break;
case 'filed':
$type_sql = ' AND i.id IN (SELECT term.oid FROM term WHERE term.ttype = ' . TERM_FILE . ' AND term.uid = i.uid ' . $filed_filter_sql . ')';
break;
default:
$type_sql = ' AND i.item_private IN (0, 1) ';
$type_sql = ' AND i.item_private IN (0, 1) AND i.item_thread_top = 1 ';
}
$items = q("SELECT *,
(SELECT count(*) FROM item c WHERE c.uid = %d AND c.parent = i.parent AND c.item_unseen = 1 AND c.item_thread_top = 0 $item_normal_c $vnotify_sql_c) AS unseen_count
FROM item i WHERE i.uid = %d
FROM item i
WHERE i.uid = %d
AND i.created <= '%s'
$type_sql
AND i.item_thread_top = 1
$author_sql
$filter_sql
$item_normal_i
ORDER BY i.created DESC $dummy_order_sql
ORDER BY $order_sql $dummy_order_sql
LIMIT $limit OFFSET $offset",
intval(local_channel()),
intval(local_channel()),
dbescdate($loadtime)
);
if ($type === 'filed') {
$items = fetch_post_tags($items);
}
xchan_query($items, false);
$i = 0;
$entries = [];
$ids = [];
foreach($items as $item) {
@@ -149,6 +178,16 @@ class Messages {
$info .= t('via') . ' ' . $item['source']['xchan_name'];
}
if ($type == 'filed') {
$info = '';
foreach ($item['term'] as $t) {
if ($t['ttype'] !== TERM_FILE) {
continue;
}
$info .= '<span class="badge rounded-pill bg-danger me-1"><i class="bi bi-folder"></i>&nbsp;' . $t['term'] . '</span>';
}
}
$summary = $item['title'];
if (!$summary) {
$summary = $item['summary'];

View File

@@ -170,11 +170,19 @@ function get_features($filtered = true, $level = (-1)) {
[
'star_posts',
t('Star Posts'),
t('Ability to mark special posts with a star indicator'),
t('Ability to mark conversations with a star'),
false,
Config::Get('feature_lock','star_posts'),
],
[
'filing',
t('File Posts'),
t('Ability to file posts'),
false,
Config::Get('feature_lock','filing'),
],
[
'reply_to',
t('Reply on comment'),

View File

@@ -212,7 +212,7 @@ $(document).ready(function() {
prepareLiveUpdate(b64mid, notify_id);
$('.message').removeClass('active');
$('[data-b64mid="' + b64mid + '"].message').addClass('active');
$('[data-b64mid="' + b64mid + '"].message .badge').remove();
$('[data-b64mid="' + b64mid + '"].message .unseen_count').remove();
}
}
}

View File

@@ -16,6 +16,13 @@
</a>
</li>
{{/if}}
{{if $feature_file}}
<li class="nav-item">
<a class="nav-link messages-type" href="#" title="{{$strings.filed_messages_title}}" data-messages_type="filed">
<i class="bi bi-folder generic-icons"></i>
</a>
</li>
{{/if}}
<li class="nav-item">
<a class="nav-link messages-type" href="#" title="{{$strings.notice_messages_title}}" data-messages_type="notification">
<i class="bi bi-exclamation-circle generic-icons"></i>
@@ -53,6 +60,18 @@
<input id="messages-author" type="text" class="form-control form-control-sm" placeholder="{{$strings.filter}}">
<div id="messages-author-input-clear" class="text-muted notifications-textinput-clear d-none"><i class="bi bi-x-lg"></i></div>
</div>
{{if $feature_file}}
<div id="messages-file-container" class="list-group-item notifications-textinput d-none">
<div class="text-muted notifications-textinput-filter"><i class="bi bi-filter"></i></div>
<input id="messages-file" type="text" list="data_filetags" class="form-control form-control-sm" placeholder="{{$strings.file_filter}}">
<datalist id="data_filetags">
{{foreach $file_tags as $opt=>$val}}
<option value="{{$val}}">
{{/foreach}}
</datalist>
<div id="messages-file-input-clear" class="text-muted notifications-textinput-clear d-none"><i class="bi bi-x-lg"></i></div>
</div>
{{/if}}
{{foreach $entries as $e}}
<a href="{{$e.href}}" class="list-group-item list-group-item-action message" data-b64mid="{{$e.b64mid}}">
<div class="mb-2 align-middle">
@@ -75,7 +94,7 @@
</div>
<small class="opacity-75">{{$e.info}}</small>
{{if $e.unseen_count}}
<span class="badge bg-transparent border border-{{$e.unseen_class}} text-{{$e.unseen_class}} rounded-pill position-absolute bottom-0 end-0 m-2" title="{{$strings.unseen_count}}">{{$e.unseen_count}}</span>
<span class="badge bg-transparent border border-{{$e.unseen_class}} text-{{$e.unseen_class}} rounded-pill position-absolute bottom-0 end-0 m-2 unseen_count" title="{{$strings.unseen_count}}">{{$e.unseen_count}}</span>
{{/if}}
</a>
{{/foreach}}
@@ -94,6 +113,7 @@
let author_hash;
let author_url;
let author;
let file;
$(document).ready(function () {
$('.messages-timeago').timeago();
@@ -109,6 +129,7 @@
$('#messages-container .message').remove();
$('#messages-author-container').addClass('active sticky-top');
$('#messages-author-input-clear').removeClass('d-none');
author_hash = data.xid;
author_url = data.url;
author = messages_type === 'notification' ? author_url : author_hash;
@@ -116,14 +137,27 @@
get_messages_page();
});
$(document).on('click', '#messages-author-input-clear', function() {
$('#messages-author').val('');
$("#messages-file").on('change', function(data) {
file = $("#messages-file").val();
$('#messages-container .message').remove();
$('#messages-file-container').addClass('active sticky-top');
$('#messages-file-input-clear').removeClass('d-none');
messages_offset = 0;
get_messages_page();
});
$(document).on('click', '#messages-author-input-clear, #messages-file-input-clear', function() {
$('#messages-author, #messages-file').val('');
$("#messages-author").attr('placeholder', '{{$strings.filter}}');
$("#messages-file").attr('placeholder', '{{$strings.file_filter}}');
$('#messages-author-container').removeClass('active sticky-top');
$('#messages-author-input-clear').addClass('d-none');
$('#messages-container .message').remove();
author = '';
file = '';
author_hash = '';
author_url = '';
messages_offset = 0;
@@ -145,6 +179,16 @@
messages_offset = 0;
messages_type = $(this).data('messages_type');
author = messages_type === 'notification' ? author_url : author_hash;
if (messages_type === 'filed') {
$('#messages-author-container').addClass('d-none');
$('#messages-file-container').removeClass('d-none');
}
else {
$('#messages-author-container').removeClass('d-none');
$('#messages-file-container').addClass('d-none');
}
$('#messages-container .message').remove();
get_messages_page();
});
@@ -167,7 +211,8 @@
data: {
offset: messages_offset,
type: messages_type,
author: author
author: author,
file: file
}
}).done(function(obj) {
get_messages_page_active = false;
@@ -185,7 +230,7 @@
e.author_addr,
e.href,
e.icon,
e.unseen_count ? '<span class="badge bg-transparent border border-' + e.unseen_class + ' text-' + e.unseen_class + ' rounded-pill position-absolute bottom-0 end-0 m-2" title="{{$strings.unseen_count}}">' + e.unseen_count + '</span>' : '',
e.unseen_count ? '<span class="badge bg-transparent border border-' + e.unseen_class + ' text-' + e.unseen_class + ' rounded-pill position-absolute bottom-0 end-0 m-2 unseen_count" title="{{$strings.unseen_count}}">' + e.unseen_count + '</span>' : '',
e.author_img
);
$('#messages-loading').before(html);