namespace Friendica\Module;
-use Friendica\App;
use Friendica\BaseModule;
use Friendica\Content\ContactSelector;
use Friendica\Content\Nav;
use Friendica\Core\Hook;
use Friendica\Core\Protocol;
use Friendica\Core\Renderer;
+use Friendica\Core\Theme;
use Friendica\Core\Worker;
use Friendica\Database\DBA;
use Friendica\DI;
use Friendica\Model;
+use Friendica\Model\User;
use Friendica\Module\Security\Login;
use Friendica\Network\HTTPException\BadRequestException;
use Friendica\Network\HTTPException\NotFoundException;
$fetch_further_information = intval($_POST['fetch_further_information'] ?? 0);
+ $remote_self = $_POST['remote_self'] ?? false;
+
$ffi_keyword_denylist = Strings::escapeHtml(trim($_POST['ffi_keyword_denylist'] ?? ''));
$priority = intval($_POST['poll'] ?? 0);
'hidden' => $hidden,
'notify_new_posts' => $notify,
'fetch_further_information' => $fetch_further_information,
+ 'remote_self' => $remote_self,
'ffi_keyword_denylist' => $ffi_keyword_denylist],
['id' => $contact_id, 'uid' => local_user()]
);
$rel = Strings::escapeTags(trim($_GET['rel'] ?? ''));
$group = Strings::escapeTags(trim($_GET['group'] ?? ''));
- if (empty(DI::page()['aside'])) {
- DI::page()['aside'] = '';
- }
+ $accounttype = $_GET['accounttype'] ?? '';
+ $accounttypeid = User::getAccountTypeByString($accounttype);
+
+ $page = DI::page();
+
+ $page->registerFooterScript(Theme::getPathForFile('asset/typeahead.js/dist/typeahead.bundle.js'));
+ $page->registerFooterScript(Theme::getPathForFile('js/friendica-tagsinput/friendica-tagsinput.js'));
+ $page->registerStylesheet(Theme::getPathForFile('js/friendica-tagsinput/friendica-tagsinput.css'));
+ $page->registerStylesheet(Theme::getPathForFile('js/friendica-tagsinput/friendica-tagsinput-typeahead.css'));
$contact = null;
// @TODO: Replace with parameter from router
$unfollow_link = '';
if (in_array($contact['network'], Protocol::NATIVE_SUPPORT)) {
if ($contact['uid'] && in_array($contact['rel'], [Model\Contact::SHARING, Model\Contact::FRIEND])) {
- $unfollow_link = 'unfollow?url=' . urlencode($contact['url']);
+ $unfollow_link = 'unfollow?url=' . urlencode($contact['url']) . '&auto=1';
} elseif(!$contact['pending']) {
- $follow_link = 'follow?url=' . urlencode($contact['url']);
+ $follow_link = 'follow?url=' . urlencode($contact['url']) . '&auto=1';
}
}
$findpeople_widget = '';
$follow_widget = '';
+ $account_widget = '';
$networks_widget = '';
$rel_widget = '';
$follow_widget = Widget::follow();
}
+ $account_widget = Widget::accounttypes($_SERVER['REQUEST_URI'], $accounttype);
$networks_widget = Widget::networks($_SERVER['REQUEST_URI'], $nets);
$rel_widget = Widget::contactRels($_SERVER['REQUEST_URI'], $rel);
$groups_widget = Widget::groups($_SERVER['REQUEST_URI'], $group);
}
- DI::page()['aside'] .= $vcard_widget . $findpeople_widget . $follow_widget . $groups_widget . $networks_widget . $rel_widget;
+ DI::page()['aside'] .= $vcard_widget . $findpeople_widget . $follow_widget . $account_widget . $groups_widget . $networks_widget . $rel_widget;
$tpl = Renderer::getMarkupTemplate('contacts-head.tpl');
DI::page()['htmlhead'] .= Renderer::replaceMacros($tpl, [
if ($cmd === 'drop' && ($orig_record['uid'] != 0)) {
// Check if we should do HTML-based delete confirmation
if (!empty($_REQUEST['confirm'])) {
- // <form> can't take arguments in its 'action' parameter
- // so add any arguments as hidden inputs
- $query = explode_querystring(DI::args()->getQueryString());
- $inputs = [];
- foreach ($query['args'] as $arg) {
- if (strpos($arg, 'confirm=') === false) {
- $arg_parts = explode('=', $arg);
- $inputs[] = ['name' => $arg_parts[0], 'value' => $arg_parts[1]];
- }
- }
-
DI::page()['aside'] = '';
return Renderer::replaceMacros(Renderer::getMarkupTemplate('contact_drop_confirm.tpl'), [
'$contact' => self::getContactTemplateVars($orig_record),
'$method' => 'get',
'$message' => DI::l10n()->t('Do you really want to delete this contact?'),
- '$extra_inputs' => $inputs,
'$confirm' => DI::l10n()->t('Yes'),
- '$confirm_url' => $query['base'],
+ '$confirm_url' => DI::args()->getCommand(),
'$confirm_name' => 'confirmed',
'$cancel' => DI::l10n()->t('Cancel'),
]);
$last_update = (($contact['last-update'] <= DBA::NULL_DATETIME) ? DI::l10n()->t('Never') : DateTimeFormat::local($contact['last-update'], 'D, j M Y, g:i A'));
if ($contact['last-update'] > DBA::NULL_DATETIME) {
- $last_update .= ' ' . (($contact['last-update'] <= $contact['success_update']) ? DI::l10n()->t('(Update was successful)') : DI::l10n()->t('(Update was not successful)'));
+ $last_update .= ' ' . ($contact['failed'] ? DI::l10n()->t('(Update was not successful)') : DI::l10n()->t('(Update was successful)'));
}
$lblsuggest = (($contact['network'] === Protocol::DFRN) ? DI::l10n()->t('Suggest friends') : '');
];
}
+ // Disable remote self for everything except feeds.
+ // There is an issue when you repeat an item from maybe twitter and you got comments from friendica and twitter
+ // Problem is, you couldn't reply to both networks.
+ $allow_remote_self = in_array($contact['network'], [Protocol::ACTIVITYPUB, Protocol::FEED, Protocol::DFRN, Protocol::DIASPORA, Protocol::TWITTER])
+ && DI::config()->get('system', 'allow_users_remote_self');
+
+ if ($contact['network'] == Protocol::FEED) {
+ $remote_self_options = [Model\Contact::MIRROR_DEACTIVATED => DI::l10n()->t('No mirroring'),
+ Model\Contact::MIRROR_FORWARDED => DI::l10n()->t('Mirror as forwarded posting'),
+ Model\Contact::MIRROR_OWN_POST => DI::l10n()->t('Mirror as my own posting')];
+ } elseif (in_array($contact['network'], [Protocol::ACTIVITYPUB])) {
+ $remote_self_options = [Model\Contact::MIRROR_DEACTIVATED => DI::l10n()->t('No mirroring'),
+ Model\Contact::MIRROR_NATIVE_RESHARE => DI::l10n()->t('Native reshare')];
+ } elseif (in_array($contact['network'], [Protocol::DFRN])) {
+ $remote_self_options = [Model\Contact::MIRROR_DEACTIVATED => DI::l10n()->t('No mirroring'),
+ Model\Contact::MIRROR_OWN_POST => DI::l10n()->t('Mirror as my own posting'),
+ Model\Contact::MIRROR_NATIVE_RESHARE => DI::l10n()->t('Native reshare')];
+ } else {
+ $remote_self_options = [Model\Contact::MIRROR_DEACTIVATED => DI::l10n()->t('No mirroring'),
+ Model\Contact::MIRROR_OWN_POST => DI::l10n()->t('Mirror as my own posting')];
+ }
+
$poll_interval = null;
- if (in_array($contact['network'], [Protocol::FEED, Protocol::MAIL])) {
+ if ((($contact['network'] == Protocol::FEED) && !DI::config()->get('system', 'adjust_poll_frequency')) || ($contact['network']== Protocol::MAIL)) {
$poll_interval = ContactSelector::pollInterval($contact['priority'], !$poll_enabled);
}
'$contact_status' => DI::l10n()->t('Status'),
'$contact_settings_label' => $contact_settings_label,
'$contact_profile_label' => DI::l10n()->t('Profile'),
+ '$allow_remote_self' => $allow_remote_self,
+ '$remote_self' => ['remote_self',
+ DI::l10n()->t('Mirror postings from this contact'),
+ $contact['remote_self'],
+ DI::l10n()->t('Mark this contact as remote_self, this will cause friendica to repost new entries from this contact.'),
+ $remote_self_options
+ ],
]);
$arr = ['contact' => $contact, 'output' => $o];
$sql_extra = " AND `archive` AND NOT `blocked` AND NOT `pending`";
break;
case 'pending':
- $sql_extra = " AND `pending` AND NOT `archive` AND ((`rel` = ?)
+ $sql_extra = " AND `pending` AND NOT `archive` AND NOT `failed` AND ((`rel` = ?)
OR EXISTS (SELECT `id` FROM `intro` WHERE `contact-id` = `contact`.`id` AND NOT `ignore`))";
$sql_values[] = Model\Contact::SHARING;
break;
break;
}
+ if (isset($accounttypeid)) {
+ $sql_extra .= " AND `contact-type` = ?";
+ $sql_values[] = $accounttypeid;
+ }
+
$searching = false;
$search_hdr = null;
if ($search) {
],
];
- if ($cid != $pcid) {
+ if (!empty($contact['network']) && in_array($contact['network'], [Protocol::FEED, Protocol::MAIL]) && ($cid != $pcid)) {
$tabs[] = ['label' => DI::l10n()->t('Advanced'),
'url' => 'contact/' . $cid . '/advanced/',
'sel' => (($active_tab == self::TAB_ADVANCED) ? 'active' : ''),
return $tab_str;
}
- private static function getConversationsHMTL($a, $contact_id, $update)
+ public static function getConversationsHMTL($a, $contact_id, $update, $parent = 0)
{
$o = '';
if (DBA::isResult($contact)) {
DI::page()['aside'] = '';
- $profiledata = Model\Contact::getByURL($contact['url'], false);
-
- Model\Profile::load($a, '', $profiledata, true);
+ if (!$update) {
+ $profiledata = Model\Contact::getByURLForUser($contact['url'], local_user());
+ Model\Profile::load($a, '', $profiledata, true);
+ }
if ($contact['uid'] == 0) {
- $o .= Model\Contact::getPostsFromId($contact['id'], true, $update);
+ $o .= Model\Contact::getPostsFromId($contact['id'], true, $update, $parent);
} else {
- $o .= Model\Contact::getPostsFromUrl($contact['url'], true, $update);
+ $o .= Model\Contact::getPostsFromUrl($contact['url'], true, $update, $parent);
}
}
if (DBA::isResult($contact)) {
DI::page()['aside'] = '';
- $profiledata = Model\Contact::getByURL($contact['url'], false);
+ $profiledata = Model\Contact::getByURLForUser($contact['url'], local_user());
if (local_user() && in_array($profiledata['network'], Protocol::FEDERATED)) {
$profiledata['remoteconnect'] = DI::baseUrl() . '/follow?url=' . urlencode($profiledata['url']);
];
}
- if (in_array($contact['network'], Protocol::FEDERATED)) {
+ if (in_array($contact['network'], Protocol::NATIVE_SUPPORT)) {
$contact_actions['updateprofile'] = [
'label' => DI::l10n()->t('Refetch contact data'),
'url' => 'contact/' . $contact['id'] . '/updateprofile',