Ensure contact tabs will use the correct id

This commit is contained in:
Michael 2020-08-02 13:34:49 +00:00
parent bb1517a74c
commit 91c360638a
5 changed files with 95 additions and 34 deletions

View file

@ -117,14 +117,6 @@ function common_content(App $a)
return $o; return $o;
} }
$entries = [];
foreach ($common_friends as $common_friend) {
$contact = Model\Contact::getByURLForUser($common_friend['url'], local_user());
if (!empty($contact)) {
$entries[] = Module\Contact::getContactTemplateVars($contact);
}
}
$title = ''; $title = '';
$tab_str = ''; $tab_str = '';
if ($cmd === 'loc' && $cid && local_user() == $uid) { if ($cmd === 'loc' && $cid && local_user() == $uid) {
@ -133,6 +125,14 @@ function common_content(App $a)
$title = DI::l10n()->t('Common Friends'); $title = DI::l10n()->t('Common Friends');
} }
$entries = [];
foreach ($common_friends as $common_friend) {
$contact = Model\Contact::getByURLForUser($common_friend['url'], local_user());
if (!empty($contact)) {
$entries[] = Module\Contact::getContactTemplateVars($contact);
}
}
$tpl = Renderer::getMarkupTemplate('viewcontact_template.tpl'); $tpl = Renderer::getMarkupTemplate('viewcontact_template.tpl');
$o .= Renderer::replaceMacros($tpl, [ $o .= Renderer::replaceMacros($tpl, [

View file

@ -3056,6 +3056,40 @@ class Contact
return array_slice($contacts, $start, $limit); return array_slice($contacts, $start, $limit);
} }
/**
* Returns a list of all common friends between two given public contact ids.
*
* @param int $cid1 first public contact id
* @param int $cid2 second public contact id
* @return int
*/
public static function countContactsOfContact(int $cid)
{
return DBA::count('contact',
["`id` IN (SELECT `cid` FROM `contact-relation` WHERE `relation-cid` = ?)
OR `id` IN (SELECT `relation-cid` FROM `contact-relation` WHERE `cid` = ?)",
$cid, $cid]
);
}
/**
* Returns a list of all contacts of a given public contact id.
*
* @param int $cid public contact id
* @param int $start optional, default 0
* @param int $limit optional, default 80
* @return array
*/
public static function getContactsOfContact(int $cid, int $start = 0, int $limit = 80)
{
return DBA::selectToArray('contact', [],
["`id` IN (SELECT `cid` FROM `contact-relation` WHERE `relation-cid` = ?)
OR `id` IN (SELECT `relation-cid` FROM `contact-relation` WHERE `cid` = ?)",
$cid, $cid],
['limit' => [$start, $limit]]
);
}
/** /**
* Add public contacts from an array * Add public contacts from an array
* *

View file

@ -54,7 +54,7 @@ class AllFriends extends BaseModule
$uid = $app->user['uid']; $uid = $app->user['uid'];
$contact = Model\Contact::getContactForUser($cid, local_user(), ['name', 'url', 'photo', 'uid', 'id']); $contact = Model\Contact::getById($cid, ['name', 'url', 'photo', 'uid', 'id']);
if (empty($contact)) { if (empty($contact)) {
throw new HTTPException\BadRequestException(DI::l10n()->t('Invalid contact.')); throw new HTTPException\BadRequestException(DI::l10n()->t('Invalid contact.'));
@ -63,25 +63,22 @@ class AllFriends extends BaseModule
DI::page()['aside'] = ""; DI::page()['aside'] = "";
Model\Profile::load($app, "", Model\Contact::getByURL($contact["url"], false)); Model\Profile::load($app, "", Model\Contact::getByURL($contact["url"], false));
$total = Model\GContact::countAllFriends(local_user(), $cid); $total = Model\Contact::countContactsOfContact($cid);
$pager = new Pager(DI::l10n(), DI::args()->getQueryString()); $pager = new Pager(DI::l10n(), DI::args()->getQueryString());
$friends = Model\GContact::allFriends(local_user(), $cid, $pager->getStart(), $pager->getItemsPerPage()); $friends = Model\Contact::getContactsOfContact($cid, $pager->getStart(), $pager->getItemsPerPage());
if (empty($friends)) { if (empty($friends)) {
return DI::l10n()->t('No friends to display.'); return DI::l10n()->t('No friends to display.');
} }
$tab_str = Contact::getTabsHTML($app, $contact, 4);
$entries = []; $entries = [];
foreach ($friends as $friend) { foreach ($friends as $friend) {
$contact = Model\Contact::getByURLForUser($friend['url'], local_user()); $entries[] = Contact::getContactTemplateVars($friend);
if (!empty($contact)) {
$entries[] = Contact::getContactTemplateVars($contact);
}
} }
$tab_str = Contact::getTabsHTML($app, $contact, 4);
$tpl = Renderer::getMarkupTemplate('viewcontact_template.tpl'); $tpl = Renderer::getMarkupTemplate('viewcontact_template.tpl');
return Renderer::replaceMacros($tpl, [ return Renderer::replaceMacros($tpl, [
'$tab_str' => $tab_str, '$tab_str' => $tab_str,

View file

@ -179,7 +179,7 @@ class Contact extends BaseModule
private static function updateContactFromProbe($contact_id) private static function updateContactFromProbe($contact_id)
{ {
$contact = DBA::selectFirst('contact', ['url'], ['id' => $contact_id, 'uid' => local_user(), 'deleted' => false]); $contact = DBA::selectFirst('contact', ['url'], ['id' => $contact_id, 'uid' => [0, local_user()], 'deleted' => false]);
if (!DBA::isResult($contact)) { if (!DBA::isResult($contact)) {
return; return;
} }
@ -257,19 +257,21 @@ class Contact extends BaseModule
DI::page()['aside'] = ''; DI::page()['aside'] = '';
} }
$contact_id = null;
$contact = null; $contact = null;
// @TODO: Replace with parameter from router // @TODO: Replace with parameter from router
if ($a->argc == 2 && intval($a->argv[1]) if ($a->argc == 2 && intval($a->argv[1])
|| $a->argc == 3 && intval($a->argv[1]) && in_array($a->argv[2], ['posts', 'conversations']) || $a->argc == 3 && intval($a->argv[1]) && in_array($a->argv[2], ['posts', 'conversations'])
) { ) {
$contact_id = intval($a->argv[1]); $contact_id = intval($a->argv[1]);
$contact = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => local_user(), 'deleted' => false]);
if (!DBA::isResult($contact)) { // Ensure to use the user contact when the public contact was provided
$contact = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => 0, 'deleted' => false]); $data = Model\Contact::getPublicAndUserContacID($contact_id, local_user());
if (!empty($data['user']) && ($contact_id == $data['public'])) {
$contact_id = $data['user'];
} }
$contact = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => [0, local_user()], 'deleted' => false]);
// Don't display contacts that are about to be deleted // Don't display contacts that are about to be deleted
if ($contact['network'] == Protocol::PHANTOM) { if ($contact['network'] == Protocol::PHANTOM) {
$contact = false; $contact = false;
@ -384,9 +386,9 @@ class Contact extends BaseModule
// NOTREACHED // NOTREACHED
} }
if ($cmd === 'updateprofile' && ($orig_record['uid'] != 0)) { if ($cmd === 'updateprofile') {
self::updateContactFromProbe($contact_id); self::updateContactFromProbe($contact_id);
DI::baseUrl()->redirect('contact/' . $contact_id . '/advanced/'); DI::baseUrl()->redirect('contact/' . $contact_id);
// NOTREACHED // NOTREACHED
} }
@ -862,11 +864,19 @@ class Contact extends BaseModule
*/ */
public static function getTabsHTML($a, $contact, $active_tab) public static function getTabsHTML($a, $contact, $active_tab)
{ {
$cid = $pcid = $contact['id'];
$data = Model\Contact::getPublicAndUserContacID($contact['id'], local_user());
if (!empty($data['user']) && ($contact['id'] == $data['public'])) {
$cid = $data['user'];
} elseif (!empty($data['public'])) {
$pcid = $data['public'];
}
// tabs // tabs
$tabs = [ $tabs = [
[ [
'label' => DI::l10n()->t('Status'), 'label' => DI::l10n()->t('Status'),
'url' => "contact/" . $contact['id'] . "/conversations", 'url' => "contact/" . $cid . "/conversations",
'sel' => (($active_tab == 1) ? 'active' : ''), 'sel' => (($active_tab == 1) ? 'active' : ''),
'title' => DI::l10n()->t('Conversations started by this contact'), 'title' => DI::l10n()->t('Conversations started by this contact'),
'id' => 'status-tab', 'id' => 'status-tab',
@ -874,7 +884,7 @@ class Contact extends BaseModule
], ],
[ [
'label' => DI::l10n()->t('Posts and Comments'), 'label' => DI::l10n()->t('Posts and Comments'),
'url' => "contact/" . $contact['id'] . "/posts", 'url' => "contact/" . $cid . "/posts",
'sel' => (($active_tab == 2) ? 'active' : ''), 'sel' => (($active_tab == 2) ? 'active' : ''),
'title' => DI::l10n()->t('Status Messages and Posts'), 'title' => DI::l10n()->t('Status Messages and Posts'),
'id' => 'posts-tab', 'id' => 'posts-tab',
@ -882,7 +892,7 @@ class Contact extends BaseModule
], ],
[ [
'label' => DI::l10n()->t('Profile'), 'label' => DI::l10n()->t('Profile'),
'url' => "contact/" . $contact['id'], 'url' => "contact/" . $cid,
'sel' => (($active_tab == 3) ? 'active' : ''), 'sel' => (($active_tab == 3) ? 'active' : ''),
'title' => DI::l10n()->t('Profile Details'), 'title' => DI::l10n()->t('Profile Details'),
'id' => 'profile-tab', 'id' => 'profile-tab',
@ -891,10 +901,10 @@ class Contact extends BaseModule
]; ];
// Show this tab only if there is visible friend list // Show this tab only if there is visible friend list
$x = Model\GContact::countAllFriends(local_user(), $contact['id']); $x = Model\Contact::countContactsOfContact($pcid);
if ($x) { if ($x) {
$tabs[] = ['label' => DI::l10n()->t('Contacts'), $tabs[] = ['label' => DI::l10n()->t('Contacts'),
'url' => "allfriends/" . $contact['id'], 'url' => "allfriends/" . $pcid,
'sel' => (($active_tab == 4) ? 'active' : ''), 'sel' => (($active_tab == 4) ? 'active' : ''),
'title' => DI::l10n()->t('View all contacts'), 'title' => DI::l10n()->t('View all contacts'),
'id' => 'allfriends-tab', 'id' => 'allfriends-tab',
@ -902,10 +912,10 @@ class Contact extends BaseModule
} }
// Show this tab only if there is visible common friend list // Show this tab only if there is visible common friend list
$common = Model\GContact::countCommonFriends(local_user(), $contact['id']); $common = Model\GContact::countCommonFriends(local_user(), $cid);
if ($common) { if ($common) {
$tabs[] = ['label' => DI::l10n()->t('Common Friends'), $tabs[] = ['label' => DI::l10n()->t('Common Friends'),
'url' => "common/loc/" . local_user() . "/" . $contact['id'], 'url' => "common/loc/" . local_user() . "/" . $cid,
'sel' => (($active_tab == 5) ? 'active' : ''), 'sel' => (($active_tab == 5) ? 'active' : ''),
'title' => DI::l10n()->t('View all common friends'), 'title' => DI::l10n()->t('View all common friends'),
'id' => 'common-loc-tab', 'id' => 'common-loc-tab',
@ -913,9 +923,9 @@ class Contact extends BaseModule
]; ];
} }
if (!empty($contact['uid'])) { if ($cid != $pcid) {
$tabs[] = ['label' => DI::l10n()->t('Advanced'), $tabs[] = ['label' => DI::l10n()->t('Advanced'),
'url' => 'contact/' . $contact['id'] . '/advanced/', 'url' => 'contact/' . $cid . '/advanced/',
'sel' => (($active_tab == 6) ? 'active' : ''), 'sel' => (($active_tab == 6) ? 'active' : ''),
'title' => DI::l10n()->t('Advanced Contact Settings'), 'title' => DI::l10n()->t('Advanced Contact Settings'),
'id' => 'advanced-tab', 'id' => 'advanced-tab',
@ -1011,6 +1021,15 @@ class Contact extends BaseModule
{ {
$alt_text = ''; $alt_text = '';
if (!empty($contact['url']) && isset($contact['uid']) && ($contact['uid'] == 0) && local_user()) {
$personal = Model\Contact::getByURL($contact['url'], false, ['uid', 'rel', 'self'], local_user());
if (!empty($personal)) {
$contact['uid'] = $personal['uid'];
$contact['rel'] = $personal['rel'];
$contact['self'] = $personal['self'];
}
}
if (!empty($contact['uid']) && !empty($contact['rel'])) { if (!empty($contact['uid']) && !empty($contact['rel'])) {
switch ($contact['rel']) { switch ($contact['rel']) {
case Model\Contact::FRIEND: case Model\Contact::FRIEND:
@ -1105,6 +1124,16 @@ class Contact extends BaseModule
]; ];
} }
if (in_array($contact['network'], Protocol::FEDERATED)) {
$contact_actions['updateprofile'] = [
'label' => DI::l10n()->t('Refetch contact data'),
'url' => 'contact/' . $contact['id'] . '/updateprofile',
'title' => '',
'sel' => '',
'id' => 'updateprofile',
];
}
$contact_actions['block'] = [ $contact_actions['block'] = [
'label' => (intval($contact['blocked']) ? DI::l10n()->t('Unblock') : DI::l10n()->t('Block')), 'label' => (intval($contact['blocked']) ? DI::l10n()->t('Unblock') : DI::l10n()->t('Block')),
'url' => 'contact/' . $contact['id'] . '/block', 'url' => 'contact/' . $contact['id'] . '/block',

View file

@ -21,7 +21,8 @@
<ul class="dropdown-menu pull-right" role="menu" aria-labelledby="contact-edit-actions-button" aria-haspopup="true" id="contact-actions-menu" > <ul class="dropdown-menu pull-right" role="menu" aria-labelledby="contact-edit-actions-button" aria-haspopup="true" id="contact-actions-menu" >
{{if $lblsuggest}}<li role="presentation"><a role="menuitem" href="{{$contact_actions.suggest.url}}" title="{{$contact_actions.suggest.title}}">{{$contact_actions.suggest.label}}</a></li>{{/if}} {{if $lblsuggest}}<li role="presentation"><a role="menuitem" href="{{$contact_actions.suggest.url}}" title="{{$contact_actions.suggest.title}}">{{$contact_actions.suggest.label}}</a></li>{{/if}}
{{if $poll_enabled}}<li role="presentation"><a role="menuitem" href="{{$contact_actions.update.url}}" title="{{$contact_actions.update.title}}">{{$contact_actions.update.label}}</a></li>{{/if}} {{if $poll_enabled}}<li role="presentation"><a role="menuitem" href="{{$contact_actions.update.url}}" title="{{$contact_actions.update.title}}">{{$contact_actions.update.label}}</a></li>{{/if}}
{{if $lblsuggest || $poll_enabled}} {{if $contact_actions.updateprofile}}<li role="presentation"><a role="menuitem" href="{{$contact_actions.updateprofile.url}}" title="{{$contact_actions.updateprofile.title}}">{{$contact_actions.updateprofile.label}}</a></li>{{/if}}
{{if $lblsuggest || $poll_enabled || $contact_actions.updateprofile}}
<li role="presentation" class="divider"></li> <li role="presentation" class="divider"></li>
{{/if}} {{/if}}
<li role="presentation"><a role="menuitem" href="{{$contact_actions.block.url}}" title="{{$contact_actions.block.title}}">{{$contact_actions.block.label}}</a></li> <li role="presentation"><a role="menuitem" href="{{$contact_actions.block.url}}" title="{{$contact_actions.block.title}}">{{$contact_actions.block.label}}</a></li>