Merge remote-tracking branch 'upstream/master'

Conflicts:
	mod/crepair.php
This commit is contained in:
Michael Vogel 2014-01-05 16:22:42 +01:00
commit aed28a24f1
35 changed files with 9339 additions and 8738 deletions

View file

@ -12,7 +12,7 @@ require_once('library/Mobile_Detect/Mobile_Detect.php');
require_once('include/features.php'); require_once('include/features.php');
define ( 'FRIENDICA_PLATFORM', 'Friendica'); define ( 'FRIENDICA_PLATFORM', 'Friendica');
define ( 'FRIENDICA_VERSION', '3.2.1745' ); define ( 'FRIENDICA_VERSION', '3.2.1747' );
define ( 'DFRN_PROTOCOL_VERSION', '2.23' ); define ( 'DFRN_PROTOCOL_VERSION', '2.23' );
define ( 'DB_UPDATE_VERSION', 1169 ); define ( 'DB_UPDATE_VERSION', 1169 );
define ( 'EOL', "<br />\r\n" ); define ( 'EOL', "<br />\r\n" );

View file

@ -215,13 +215,14 @@ function contact_photo_menu($contact) {
$status_link = $profile_link . "?url=status"; $status_link = $profile_link . "?url=status";
$photos_link = $profile_link . "?url=photos"; $photos_link = $profile_link . "?url=photos";
$profile_link = $profile_link . "?url=profile"; $profile_link = $profile_link . "?url=profile";
$contact_drop_link = $a->get_baseurl() . '/contacts/' . $contact['id'] . '/drop';
$pm_url = $a->get_baseurl() . '/message/new/' . $contact['id']; $pm_url = $a->get_baseurl() . '/message/new/' . $contact['id'];
} }
$poke_link = $a->get_baseurl() . '/poke/?f=&c=' . $contact['id']; $poke_link = $a->get_baseurl() . '/poke/?f=&c=' . $contact['id'];
$contact_url = $a->get_baseurl() . '/contacts/' . $contact['id']; $contact_url = $a->get_baseurl() . '/contacts/' . $contact['id'];
$posts_link = $a->get_baseurl() . '/network/0?nets=all&cid=' . $contact['id']; $posts_link = $a->get_baseurl() . '/network/0?nets=all&cid=' . $contact['id'];
$contact_drop_link = $a->get_baseurl() . "/contacts/" . $contact['id'] . '/drop?confirm=1';
$menu = Array( $menu = Array(
'poke' => array(t("Poke"), $poke_link), 'poke' => array(t("Poke"), $poke_link),

View file

@ -1,6 +1,7 @@
<?php <?php
require_once("include/contact_selectors.php"); require_once("include/contact_selectors.php");
require_once("include/features.php");
/** /**
* *
@ -329,6 +330,9 @@ function populate_acl($user = null,$celeb = false) {
'$allowgid' => json_encode($perms['allow_gid']), '$allowgid' => json_encode($perms['allow_gid']),
'$denycid' => json_encode($perms['deny_cid']), '$denycid' => json_encode($perms['deny_cid']),
'$denygid' => json_encode($perms['deny_gid']), '$denygid' => json_encode($perms['deny_gid']),
'$features' => array(
"aclautomention"=>(feature_enabled($user,"aclautomention")?"true":"false")
),
)); ));
@ -474,14 +478,15 @@ function acl_lookup(&$a, $out_type = 'json') {
"name" => $g['name'], "name" => $g['name'],
"id" => intval($g['id']), "id" => intval($g['id']),
"uids" => array_map("intval", explode(",",$g['uids'])), "uids" => array_map("intval", explode(",",$g['uids'])),
"link" => '' "link" => '',
"forum" => '0'
); );
} }
} }
if ($type=='' || $type=='c'){ if ($type=='' || $type=='c'){
$r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag` FROM `contact` $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, forum FROM `contact`
WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 AND `archive` = 0 AND `notify` != '' WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 AND `archive` = 0 AND `notify` != ''
$sql_extra2 $sql_extra2
ORDER BY `name` ASC ", ORDER BY `name` ASC ",
@ -541,6 +546,7 @@ function acl_lookup(&$a, $out_type = 'json') {
"network" => $g['network'], "network" => $g['network'],
"link" => $g['url'], "link" => $g['url'],
"nick" => ($g['attag']) ? $g['attag'] : $g['nick'], "nick" => ($g['attag']) ? $g['attag'] : $g['nick'],
"forum" => $g['forum']
); );
} }
} }

View file

@ -74,7 +74,7 @@
logger('API_login: ' . print_r($_SERVER,true), LOGGER_DEBUG); logger('API_login: ' . print_r($_SERVER,true), LOGGER_DEBUG);
header('WWW-Authenticate: Basic realm="Friendica"'); header('WWW-Authenticate: Basic realm="Friendica"');
header('HTTP/1.0 401 Unauthorized'); header('HTTP/1.0 401 Unauthorized');
die((api_error(&$a, 'json', "This api requires login"))); die((api_error($a, 'json', "This api requires login")));
//die('This api requires login'); //die('This api requires login');
} }
@ -174,7 +174,7 @@
} }
header("HTTP/1.1 404 Not Found"); header("HTTP/1.1 404 Not Found");
logger('API call not implemented: '.$a->query_string." - ".print_r($_REQUEST,true)); logger('API call not implemented: '.$a->query_string." - ".print_r($_REQUEST,true));
return(api_error(&$a, $type, "not implemented")); return(api_error($a, $type, "not implemented"));
} }

View file

@ -504,6 +504,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
$tpl = 'search_item.tpl'; $tpl = 'search_item.tpl';
foreach($items as $item) { foreach($items as $item) {
if($arr_blocked) { if($arr_blocked) {
$blocked = false; $blocked = false;
foreach($arr_blocked as $b) { foreach($arr_blocked as $b) {
@ -648,6 +649,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
$tmp_item = array( $tmp_item = array(
'template' => $tpl, 'template' => $tpl,
'id' => (($preview) ? 'P0' : $item['item_id']), 'id' => (($preview) ? 'P0' : $item['item_id']),
'network' => $item['item_network'],
'linktitle' => sprintf( t('View %s\'s profile @ %s'), $profile_name, ((strlen($item['author-link'])) ? $item['author-link'] : $item['url'])), 'linktitle' => sprintf( t('View %s\'s profile @ %s'), $profile_name, ((strlen($item['author-link'])) ? $item['author-link'] : $item['url'])),
'profile_url' => $profile_link, 'profile_url' => $profile_link,
'item_photo_menu' => item_photo_menu($item), 'item_photo_menu' => item_photo_menu($item),
@ -693,6 +695,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
call_hooks('display_item', $arr); call_hooks('display_item', $arr);
$threads[$threadsid]['id'] = $item['item_id']; $threads[$threadsid]['id'] = $item['item_id'];
$threads[$threadsid]['network'] = $item['item_network'];
$threads[$threadsid]['items'] = array($arr['output']); $threads[$threadsid]['items'] = array($arr['output']);
} }

View file

@ -30,6 +30,7 @@ function get_features() {
t('Post Composition Features'), t('Post Composition Features'),
array('richtext', t('Richtext Editor'), t('Enable richtext editor')), array('richtext', t('Richtext Editor'), t('Enable richtext editor')),
array('preview', t('Post Preview'), t('Allow previewing posts and comments before publishing them')), array('preview', t('Post Preview'), t('Allow previewing posts and comments before publishing them')),
array('aclautomention', t('Auto-mention Forums'), t('Add/remove mention when a fourm page is selected/deselected in ACL window.')),
), ),
// Network sidebar widgets // Network sidebar widgets

View file

@ -617,7 +617,6 @@ function fetch_xrd_links($url) {
if(! function_exists('validate_url')) { if(! function_exists('validate_url')) {
function validate_url(&$url) { function validate_url(&$url) {
// no naked subdomains (allow localhost for tests) // no naked subdomains (allow localhost for tests)
if(strpos($url,'.') === false && strpos($url,'/localhost/') === false) if(strpos($url,'.') === false && strpos($url,'/localhost/') === false)
return false; return false;

View file

@ -44,6 +44,11 @@ function check_conversations() {
function complete_conversation($itemid, $conversation_url, $only_add_conversation = false) { function complete_conversation($itemid, $conversation_url, $only_add_conversation = false) {
global $a; global $a;
if ($a->last_ostatus_conversation_url == $conversation_url)
return;
$a->last_ostatus_conversation_url = $conversation_url;
//logger('complete_conversation: completing conversation url '.$conversation_url.' for id '.$itemid); //logger('complete_conversation: completing conversation url '.$conversation_url.' for id '.$itemid);
$messages = q("SELECT `uid`, `parent`, `created` FROM `item` WHERE `id` = %d LIMIT 1", intval($itemid)); $messages = q("SELECT `uid`, `parent`, `created` FROM `item` WHERE `id` = %d LIMIT 1", intval($itemid));

View file

@ -1,7 +1,8 @@
function ACL(backend_url, preset){ function ACL(backend_url, preset, automention){
that = this; that = this;
that.url = backend_url; that.url = backend_url;
that.automention = automention;
that.kp_timer = null; that.kp_timer = null;
@ -26,10 +27,45 @@ function ACL(backend_url, preset){
$("#acl-search").keypress(that.on_search); $("#acl-search").keypress(that.on_search);
$("#acl-wrapper").parents("form").submit(that.on_submit); $("#acl-wrapper").parents("form").submit(that.on_submit);
/* add/remove mentions */
that.element = $("#profile-jot-text");
that.htmlelm = that.element.get()[0];
/* startup! */ /* startup! */
that.get(0,100); that.get(0,100);
} }
ACL.prototype.remove_mention = function(id) {
if (!that.automention) return;
var nick = that.data[id].nick;
var searchText = "@"+nick+"+"+id+" ";
if (tinyMCE.activeEditor===null) {
start = that.element.val().indexOf(searchText);
if ( start<0) return;
end = start+searchText.length;
that.element.setSelection(start,end).replaceSelectedText('').collapseSelection(false);
} else {
start = tinyMCE.activeEditor.getContent({format : 'raw'}).search( searchText );
if ( start<0 ) return;
txt = tinyMCE.activeEditor.getContent();
newtxt = txt.replace(searchText, '');
tinyMCE.activeEditor.setContent(newtxt);
}
}
ACL.prototype.add_mention = function(id) {
if (!that.automention) return;
var nick = that.data[id].nick;
var searchText = "@"+nick+"+"+id+" ";
if (tinyMCE.activeEditor===null) {
if ( that.element.val().indexOf( searchText) >= 0 ) return;
that.element.val( searchText + that.element.val() );
} else {
if ( tinyMCE.activeEditor.getContent({format : 'raw'}).search(searchText) >= 0 ) return;
tinyMCE.activeEditor.dom.add(tinyMCE.activeEditor.getBody(), 'span', {}, searchText);
}
}
ACL.prototype.on_submit = function(){ ACL.prototype.on_submit = function(){
aclfileds = $("#acl-fields").html(""); aclfileds = $("#acl-fields").html("");
$(that.allow_gid).each(function(i,v){ $(that.allow_gid).each(function(i,v){
@ -106,6 +142,7 @@ ACL.prototype.on_button_hide = function(event){
ACL.prototype.set_allow = function(itemid){ ACL.prototype.set_allow = function(itemid){
type = itemid[0]; type = itemid[0];
id = parseInt(itemid.substr(1)); id = parseInt(itemid.substr(1));
switch(type){ switch(type){
case "g": case "g":
if (that.allow_gid.indexOf(id)<0){ if (that.allow_gid.indexOf(id)<0){
@ -118,8 +155,10 @@ ACL.prototype.set_allow = function(itemid){
case "c": case "c":
if (that.allow_cid.indexOf(id)<0){ if (that.allow_cid.indexOf(id)<0){
that.allow_cid.push(id) that.allow_cid.push(id)
if (that.data[id].forum=="1") that.add_mention(id);
} else { } else {
that.allow_cid.remove(id); that.allow_cid.remove(id);
if (that.data[id].forum=="1") that.remove_mention(id);
} }
if (that.deny_cid.indexOf(id)>=0) that.deny_cid.remove(id); if (that.deny_cid.indexOf(id)>=0) that.deny_cid.remove(id);
break; break;
@ -130,6 +169,7 @@ ACL.prototype.set_allow = function(itemid){
ACL.prototype.set_deny = function(itemid){ ACL.prototype.set_deny = function(itemid){
type = itemid[0]; type = itemid[0];
id = parseInt(itemid.substr(1)); id = parseInt(itemid.substr(1));
switch(type){ switch(type){
case "g": case "g":
if (that.deny_gid.indexOf(id)<0){ if (that.deny_gid.indexOf(id)<0){
@ -140,6 +180,7 @@ ACL.prototype.set_deny = function(itemid){
if (that.allow_gid.indexOf(id)>=0) that.allow_gid.remove(id); if (that.allow_gid.indexOf(id)>=0) that.allow_gid.remove(id);
break; break;
case "c": case "c":
if (that.data[id].forum=="1") that.remove_mention(id);
if (that.deny_cid.indexOf(id)<0){ if (that.deny_cid.indexOf(id)<0){
that.deny_cid.push(id) that.deny_cid.push(id)
} else { } else {
@ -151,9 +192,13 @@ ACL.prototype.set_deny = function(itemid){
that.update_view(); that.update_view();
} }
ACL.prototype.is_show_all = function() {
return (that.allow_gid.length==0 && that.allow_cid.length==0 &&
that.deny_gid.length==0 && that.deny_cid.length==0);
}
ACL.prototype.update_view = function(){ ACL.prototype.update_view = function(){
if (that.allow_gid.length==0 && that.allow_cid.length==0 && if (this.is_show_all()){
that.deny_gid.length==0 && that.deny_cid.length==0){
that.showall.addClass("selected"); that.showall.addClass("selected");
/* jot acl */ /* jot acl */
$('#jot-perms-icon').removeClass('lock').addClass('unlock'); $('#jot-perms-icon').removeClass('lock').addClass('unlock');
@ -246,17 +291,20 @@ ACL.prototype.get = function(start,count, search){
ACL.prototype.populate = function(data){ ACL.prototype.populate = function(data){
var height = Math.ceil(data.tot / that.nw) * 42; var height = Math.ceil(data.tot / that.nw) * 42;
that.list_content.height(height); that.list_content.height(height);
that.data = {};
$(data.items).each(function(){ $(data.items).each(function(){
html = "<div class='acl-list-item {4} {5}' title='{6}' id='{2}{3}'>"+that.item_tpl+"</div>"; html = "<div class='acl-list-item {4} {5} type{2}' title='{6}' id='{2}{3}'>"+that.item_tpl+"</div>";
html = html.format(this.photo, this.name, this.type, this.id, '', this.network, this.link); html = html.format(this.photo, this.name, this.type, this.id, (this.forum=='1'?'forum':''), this.network, this.link);
if (this.uids!=undefined) that.group_uids[this.id] = this.uids; if (this.uids!=undefined) that.group_uids[this.id] = this.uids;
//console.log(html); //console.log(html);
that.list_content.append(html); that.list_content.append(html);
that.data[this.id] = this;
}); });
$(".acl-list-item img[data-src]", that.list_content).each(function(i, el){ $(".acl-list-item img[data-src]", that.list_content).each(function(i, el){
// Add src attribute for images with a data-src attribute // Add src attribute for images with a data-src attribute
$(el).attr('src', $(el).data("src")); $(el).attr('src', $(el).data("src"));
}); });
that.update_view(); that.update_view();
} }

View file

@ -89,7 +89,7 @@ ACPopup.prototype._search = function(){
}); });
} }
ACPopup.prototype.add = function(label, value){ ACPopup.prototype.add = function(label, value){
var that=this; var that=this;
var elm = $("<div class='acpopupitem' title='"+value+"'>"+label+"</div>"); var elm = $("<div class='acpopupitem' title='"+value+"'>"+label+"</div>");
elm.click(function(e){ elm.click(function(e){

View file

@ -341,7 +341,7 @@ abstract class Slinky_Service {
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 ); // Don't stress about SSL validity curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 ); // Don't stress about SSL validity
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 ); // Return the response, don't output it curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 ); // Return the response, don't output it
curl_setopt( $ch, CURLOPT_TIMEOUT, SLINKY_TIMEOUT ); // Limit how long we'll wait for a response curl_setopt( $ch, CURLOPT_TIMEOUT, SLINKY_TIMEOUT ); // Limit how long we'll wait for a response
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 ); // Allow following of redirections //curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 ); // Allow following of redirections
$r = curl_exec( $ch ); $r = curl_exec( $ch );
if ( curl_errno( $ch ) ) { if ( curl_errno( $ch ) ) {
return false; return false;
@ -372,7 +372,7 @@ abstract class Slinky_Service {
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 ); // Don't stress about SSL validity curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 ); // Don't stress about SSL validity
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 ); // Return the response, don't output it curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 ); // Return the response, don't output it
curl_setopt( $ch, CURLOPT_TIMEOUT, SLINKY_TIMEOUT ); // Limit how long we'll wait for a response curl_setopt( $ch, CURLOPT_TIMEOUT, SLINKY_TIMEOUT ); // Limit how long we'll wait for a response
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 ); // Allow following of redirections //curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 ); // Allow following of redirections
$r = curl_exec( $ch ); $r = curl_exec( $ch );
if ( curl_errno( $ch ) ) { if ( curl_errno( $ch ) ) {
return false; return false;

View file

@ -328,6 +328,7 @@ function admin_page_site_post(&$a){
$enotify_no_content = ((x($_POST,'enotify_no_content')) ? True : False); $enotify_no_content = ((x($_POST,'enotify_no_content')) ? True : False);
$private_addons = ((x($_POST,'private_addons')) ? True : False); $private_addons = ((x($_POST,'private_addons')) ? True : False);
$disable_embedded = ((x($_POST,'disable_embedded')) ? True : False); $disable_embedded = ((x($_POST,'disable_embedded')) ? True : False);
$allow_users_remote_self = ((x($_POST,'allow_users_remote_self')) ? True : False);
$no_multi_reg = ((x($_POST,'no_multi_reg')) ? True : False); $no_multi_reg = ((x($_POST,'no_multi_reg')) ? True : False);
$no_openid = !((x($_POST,'no_openid')) ? True : False); $no_openid = !((x($_POST,'no_openid')) ? True : False);
@ -453,6 +454,7 @@ function admin_page_site_post(&$a){
set_config('system','newuser_private', $newuser_private); set_config('system','newuser_private', $newuser_private);
set_config('system','enotify_no_content', $enotify_no_content); set_config('system','enotify_no_content', $enotify_no_content);
set_config('system','disable_embedded', $disable_embedded); set_config('system','disable_embedded', $disable_embedded);
set_config('system','allow_users_remote_self', $allow_users_remote_self);
set_config('system','block_extended_register', $no_multi_reg); set_config('system','block_extended_register', $no_multi_reg);
set_config('system','no_openid', $no_openid); set_config('system','no_openid', $no_openid);
@ -603,7 +605,7 @@ function admin_page_site(&$a) {
'$enotify_no_content' => array('enotify_no_content', t("Don't include post content in email notifications"), get_config('system','enotify_no_content'), t("Don't include the content of a post/comment/private message/etc. in the email notifications that are sent out from this site, as a privacy measure.")), '$enotify_no_content' => array('enotify_no_content', t("Don't include post content in email notifications"), get_config('system','enotify_no_content'), t("Don't include the content of a post/comment/private message/etc. in the email notifications that are sent out from this site, as a privacy measure.")),
'$private_addons' => array('private_addons', t("Disallow public access to addons listed in the apps menu."), get_config('config','private_addons'), t("Checking this box will restrict addons listed in the apps menu to members only.")), '$private_addons' => array('private_addons', t("Disallow public access to addons listed in the apps menu."), get_config('config','private_addons'), t("Checking this box will restrict addons listed in the apps menu to members only.")),
'$disable_embedded' => array('disable_embedded', t("Don't embed private images in posts"), get_config('system','disable_embedded'), t("Don't replace locally-hosted private photos in posts with an embedded copy of the image. This means that contacts who receive posts containing private photos will have to authenticate and load each image, which may take a while.")), '$disable_embedded' => array('disable_embedded', t("Don't embed private images in posts"), get_config('system','disable_embedded'), t("Don't replace locally-hosted private photos in posts with an embedded copy of the image. This means that contacts who receive posts containing private photos will have to authenticate and load each image, which may take a while.")),
'$allow_users_remote_self' => array('allow_users_remote_self', t('Allow Users to set remote_self'), get_config('system','allow_users_remote_self'), t('With checking this, every user is allowed to mark every contact as a remote_self in the repair contact dialog. Setting this flag on a contact causes mirroring every posting of that contact in the users stream.')),
'$no_multi_reg' => array('no_multi_reg', t("Block multiple registrations"), get_config('system','block_extended_register'), t("Disallow users to register additional accounts for use as pages.")), '$no_multi_reg' => array('no_multi_reg', t("Block multiple registrations"), get_config('system','block_extended_register'), t("Disallow users to register additional accounts for use as pages.")),
'$no_openid' => array('no_openid', t("OpenID support"), !get_config('system','no_openid'), t("OpenID support for registration and logins.")), '$no_openid' => array('no_openid', t("OpenID support"), !get_config('system','no_openid'), t("OpenID support for registration and logins.")),
'$no_regfullname' => array('no_regfullname', t("Fullname check"), !get_config('system','no_regfullname'), t("Force users to register with a space between firstname and lastname in Full name, as an antispam measure")), '$no_regfullname' => array('no_regfullname', t("Fullname check"), !get_config('system','no_regfullname'), t("Force users to register with a space between firstname and lastname in Full name, as an antispam measure")),

View file

@ -67,11 +67,61 @@ function contacts_init(&$a) {
} }
function contacts_batch_actions(&$a){
$contacts_id = $_POST['contact_batch'];
if (!is_array($contacts_id)) return;
$orig_records = q("SELECT * FROM `contact` WHERE `id` IN (%s) AND `uid` = %d AND `self` = 0",
implode(",", $contacts_id),
intval(local_user())
);
$count_actions=0;
foreach($orig_records as $orig_record) {
$contact_id = $orig_record['id'];
if (x($_POST, 'contacts_batch_update')) {
_contact_update($contact_id);
$count_actions++;
}
if (x($_POST, 'contacts_batch_block')) {
$r = _contact_block($contact_id, $orig_record);
if ($r) $count_actions++;
}
if (x($_POST, 'contacts_batch_ignore')) {
$r = _contact_ignore($contact_id, $orig_record);
if ($r) $count_actions++;
}
if (x($_POST, 'contacts_batch_archive')) {
$r = _contact_archive($contact_id, $orig_record);
if ($r) $count_actions++;
}
if (x($_POST, 'contacts_batch_drop')) {
_contact_drop($contact_id, $orig_record);
$count_actions++;
}
}
if ($count_actions>0) {
info ( sprintf( tt("%d contact edited.", "%d contacts edited", $count_actions), $count_actions) );
}
if(x($_SESSION,'return_url'))
goaway($a->get_baseurl(true) . '/' . $_SESSION['return_url']);
else
goaway($a->get_baseurl(true) . '/contacts');
}
function contacts_post(&$a) { function contacts_post(&$a) {
if(! local_user()) if(! local_user())
return; return;
if ($a->argv[1]==="batch") {
contacts_batch_actions($a);
return;
}
$contact_id = intval($a->argv[1]); $contact_id = intval($a->argv[1]);
if(! $contact_id) if(! $contact_id)
return; return;
@ -140,6 +190,49 @@ function contacts_post(&$a) {
} }
/*contact actions*/
function _contact_update($contact_id) {
// pull feed and consume it, which should subscribe to the hub.
proc_run('php',"include/poller.php","$contact_id");
}
function _contact_block($contact_id, $orig_record) {
$blocked = (($orig_record['blocked']) ? 0 : 1);
$r = q("UPDATE `contact` SET `blocked` = %d WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval($blocked),
intval($contact_id),
intval(local_user())
);
return $r;
}
function _contact_ignore($contact_id, $orig_record) {
$readonly = (($orig_record['readonly']) ? 0 : 1);
$r = q("UPDATE `contact` SET `readonly` = %d WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval($readonly),
intval($contact_id),
intval(local_user())
);
return $r;
}
function _contact_archive($contact_id, $orig_record) {
$archived = (($orig_record['archive']) ? 0 : 1);
$r = q("UPDATE `contact` SET `archive` = %d WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval($archived),
intval($contact_id),
intval(local_user())
);
if ($archived) {
q("UPDATE `item` SET `private` = 2 WHERE `contact-id` = %d AND `uid` = %d", intval($contact_id), intval(local_user()));
}
return $r;
}
function _contact_drop($contact_id, $orig_record) {
require_once('include/Contact.php');
$a = get_app();
terminate_friendship($a->user,$a->contact,$orig_record);
contact_remove($orig_record['id']);
}
function contacts_content(&$a) { function contacts_content(&$a) {
@ -174,57 +267,38 @@ function contacts_content(&$a) {
} }
if($cmd === 'update') { if($cmd === 'update') {
_contact_update($contact_id);
// pull feed and consume it, which should subscribe to the hub.
proc_run('php',"include/poller.php","$contact_id");
goaway($a->get_baseurl(true) . '/contacts/' . $contact_id); goaway($a->get_baseurl(true) . '/contacts/' . $contact_id);
// NOTREACHED // NOTREACHED
} }
if($cmd === 'block') { if($cmd === 'block') {
$blocked = (($orig_record[0]['blocked']) ? 0 : 1); $r = _contact_block($contact_id, $orig_record[0]);
$r = q("UPDATE `contact` SET `blocked` = %d WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval($blocked),
intval($contact_id),
intval(local_user())
);
if($r) { if($r) {
//notice( t('Contact has been ') . (($blocked) ? t('blocked') : t('unblocked')) . EOL );
info( (($blocked) ? t('Contact has been blocked') : t('Contact has been unblocked')) . EOL ); info( (($blocked) ? t('Contact has been blocked') : t('Contact has been unblocked')) . EOL );
} }
goaway($a->get_baseurl(true) . '/contacts/' . $contact_id); goaway($a->get_baseurl(true) . '/contacts/' . $contact_id);
return; // NOTREACHED return; // NOTREACHED
} }
if($cmd === 'ignore') { if($cmd === 'ignore') {
$readonly = (($orig_record[0]['readonly']) ? 0 : 1); $r = _contact_ignore($contact_id, $orig_record[0]);
$r = q("UPDATE `contact` SET `readonly` = %d WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval($readonly),
intval($contact_id),
intval(local_user())
);
if($r) { if($r) {
info( (($readonly) ? t('Contact has been ignored') : t('Contact has been unignored')) . EOL ); info( (($readonly) ? t('Contact has been ignored') : t('Contact has been unignored')) . EOL );
} }
goaway($a->get_baseurl(true) . '/contacts/' . $contact_id); goaway($a->get_baseurl(true) . '/contacts/' . $contact_id);
return; // NOTREACHED return; // NOTREACHED
} }
if($cmd === 'archive') { if($cmd === 'archive') {
$archived = (($orig_record[0]['archive']) ? 0 : 1); $r = _contact_archive($contact_id, $orig_record[0]);
$r = q("UPDATE `contact` SET `archive` = %d WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval($archived),
intval($contact_id),
intval(local_user())
);
if ($archived) {
q("UPDATE `item` SET `private` = 2 WHERE `contact-id` = %d AND `uid` = %d", intval($contact_id), intval(local_user()));
}
if($r) { if($r) {
//notice( t('Contact has been ') . (($archived) ? t('archived') : t('unarchived')) . EOL );
info( (($archived) ? t('Contact has been archived') : t('Contact has been unarchived')) . EOL ); info( (($archived) ? t('Contact has been archived') : t('Contact has been unarchived')) . EOL );
} }
goaway($a->get_baseurl(true) . '/contacts/' . $contact_id); goaway($a->get_baseurl(true) . '/contacts/' . $contact_id);
return; // NOTREACHED return; // NOTREACHED
} }
@ -257,15 +331,13 @@ function contacts_content(&$a) {
} }
// Now check how the user responded to the confirmation query // Now check how the user responded to the confirmation query
if($_REQUEST['canceled']) { if($_REQUEST['canceled']) {
if(x($_SESSION,'return_url'))
goaway($a->get_baseurl(true) . '/' . $_SESSION['return_url']); goaway($a->get_baseurl(true) . '/' . $_SESSION['return_url']);
else
goaway($a->get_baseurl(true) . '/contacts');
} }
require_once('include/Contact.php'); _contact_drop($contact_id, $orig_record[0]);
terminate_friendship($a->user,$a->contact,$orig_record[0]);
contact_remove($orig_record[0]['id']);
info( t('Contact has been removed.') . EOL ); info( t('Contact has been removed.') . EOL );
if(x($_SESSION,'return_url')) if(x($_SESSION,'return_url'))
goaway($a->get_baseurl(true) . '/' . $_SESSION['return_url']); goaway($a->get_baseurl(true) . '/' . $_SESSION['return_url']);
@ -534,7 +606,7 @@ function contacts_content(&$a) {
$search_txt = dbesc(protect_sprintf(preg_quote($search))); $search_txt = dbesc(protect_sprintf(preg_quote($search)));
$searching = true; $searching = true;
} }
$sql_extra .= (($searching) ? " AND `name` REGEXP '$search_txt' " : ""); $sql_extra .= (($searching) ? " AND (name REGEXP '$search_txt' OR url REGEXP '$search_txt' OR nick REGEXP '$search_txt') " : "");
if($nets) if($nets)
$sql_extra .= sprintf(" AND network = '%s' ", dbesc($nets)); $sql_extra .= sprintf(" AND network = '%s' ", dbesc($nets));
@ -612,6 +684,7 @@ function contacts_content(&$a) {
$tpl = get_markup_template("contacts-template.tpl"); $tpl = get_markup_template("contacts-template.tpl");
$o .= replace_macros($tpl, array( $o .= replace_macros($tpl, array(
'$baseurl' => $a->get_baseurl(),
'$header' => t('Contacts') . (($nets) ? ' - ' . network_to_name($nets) : ''), '$header' => t('Contacts') . (($nets) ? ' - ' . network_to_name($nets) : ''),
'$tabs' => $t, '$tabs' => $t,
'$total' => $total, '$total' => $total,
@ -621,6 +694,14 @@ function contacts_content(&$a) {
'$submit' => t('Find'), '$submit' => t('Find'),
'$cmd' => $a->cmd, '$cmd' => $a->cmd,
'$contacts' => $contacts, '$contacts' => $contacts,
'$contact_drop_confirm' => t('Do you really want to delete this contact?'),
'$batch_actions' => array(
'contacts_batch_update' => t('Update'),
'contacts_batch_block' => t('Block')."/".t("Unblock"),
"contacts_batch_ignore" => t('Ignore')."/".t("Unignore"),
"contacts_batch_archive" => t('Archive')."/".t("Unarchive"),
"contacts_batch_drop" => t('Delete'),
),
'$paginate' => paginate($a), '$paginate' => paginate($a),
)); ));

View file

@ -156,7 +156,9 @@ function crepair_content(&$a) {
'$label_notify' => t('Notification Endpoint URL'), '$label_notify' => t('Notification Endpoint URL'),
'$label_poll' => t('Poll/Feed URL'), '$label_poll' => t('Poll/Feed URL'),
'$label_photo' => t('New photo from this URL'), '$label_photo' => t('New photo from this URL'),
'$label_self' => t('Mirror all posts to the wall?'), '$label_remote_self' => t('Remote Self'),
'$allow_remote_self' => get_config('system','allow_users_remote_self'),
'$remote_self' => array('remote_self', t('Mirror postings from this contact'), $contact['remote_self'], t('Mark this contact as remote_self, this will cause friendica to repost new entries from this contact.')),
'$contact_name' => $contact['name'], '$contact_name' => $contact['name'],
'$contact_nick' => $contact['nick'], '$contact_nick' => $contact['nick'],
'$contact_id' => $contact['id'], '$contact_id' => $contact['id'],

View file

@ -311,9 +311,9 @@ function parse_url_content(&$a) {
logger('parse_url: ' . $url); logger('parse_url: ' . $url);
if($textmode) if($textmode)
$template = $br . '[bookmark=%s]%s[/bookmark]%s' . $br; $template = '[bookmark=%s]%s[/bookmark]%s' . $br;
else else
$template = "<br /><a class=\"bookmark\" href=\"%s\" >%s</a>%s<br />"; $template = "<a class=\"bookmark\" href=\"%s\" >%s</a>%s<br />";
$arr = array('url' => $url, 'text' => ''); $arr = array('url' => $url, 'text' => '');
@ -328,9 +328,9 @@ function parse_url_content(&$a) {
if($url && $title && $text) { if($url && $title && $text) {
if($textmode) if($textmode)
$text = $br . '[quote]' . trim($text) . '[/quote]' . $br; $text = '[quote]' . trim($text) . '[/quote]' . $br;
else else
$text = '<br /><blockquote>' . trim($text) . '</blockquote><br />'; $text = '<blockquote>' . trim($text) . '</blockquote><br />';
$title = str_replace(array("\r","\n"),array('',''),$title); $title = str_replace(array("\r","\n"),array('',''),$title);
@ -344,8 +344,10 @@ function parse_url_content(&$a) {
$siteinfo = parseurl_getsiteinfo($url); $siteinfo = parseurl_getsiteinfo($url);
$sitedata = "";
if($siteinfo["title"] == "") { if($siteinfo["title"] == "") {
echo sprintf($template,$url,$url,'') . $str_tags; $sitedata .= sprintf($template,$url,$url,'') . $str_tags;
killme(); killme();
} else { } else {
$text = $siteinfo["text"]; $text = $siteinfo["text"];
@ -377,20 +379,24 @@ function parse_url_content(&$a) {
if(strlen($text)) { if(strlen($text)) {
if($textmode) if($textmode)
$text = $br.'[quote]'.trim($text).'[/quote]'.$br ; $text = '[quote]'.trim($text).'[/quote]';
else else
$text = '<br /><blockquote>'.trim($text).'</blockquote><br />'; $text = '<blockquote>'.trim($text).'</blockquote>';
} }
if($image) { if($image) {
$text = $br.$br.$image.$text; $text = $br.$br.$image.$text;
} }
$title = str_replace(array("\r","\n"),array('',''),$title); $title = str_replace(array("\r","\n"),array('',''),$title);
$result = sprintf($template,$url,($title) ? $title : $url,$text) . $str_tags; $result = sprintf($template,$url,($title) ? $title : $url,$text) . $str_tags;
logger('parse_url: returns: ' . $result); logger('parse_url: returns: ' . $result);
echo trim($result); $sitedata .= trim($result);
echo "[class=type-link]".$sitedata."[/class]";
killme(); killme();
} }

View file

@ -1,6 +1,18 @@
Site speed can be improved when the following indexes are set. They cannot be set through the update script because on large sites they will block the site for several minutes. Site speed can be improved when the following indexes are set. They
cannot be set through the update script because on large sites they will
block the site for several minutes.
CREATE INDEX `uid_commented` ON `item` (`uid`, `commented`); CREATE INDEX `uid_commented` ON `item` (`uid`, `commented`);
CREATE INDEX `uid_created` ON `item` (`uid`, `created`); CREATE INDEX `uid_created` ON `item` (`uid`, `created`);
CREATE INDEX `uid_unseen` ON `item` (`uid`, `unseen`); CREATE INDEX `uid_unseen` ON `item` (`uid`, `unseen`);
CREATE INDEX `resource-id` ON `item` (`resource-id`); CREATE INDEX `resource-id` ON `item` (`resource-id`);
CREATE INDEX `uri_received` ON item(`uri`, `received`);
CREATE INDEX `received_uri` ON item(`received`, `uri`);
CREATE INDEX `contact-id_created` ON item(`contact-id`, created);
CREATE INDEX `uid_network_received` ON item(`uid`, `network`, `received`);
CREATE INDEX `uid_parent` ON item(`uid`, `parent`);
CREATE INDEX `uid_received` ON item(`uid`, `received`);
CREATE INDEX `uid_network_commented` ON item(`uid`, `network`, `commented`);
CREATE INDEX `uid_commented` ON item(`uid`, `commented`);
CREATE INDEX `uid_title` ON item(uid, `title`);
CREATE INDEX `created_contact-id` ON item(`created`, `contact-id`);

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -485,6 +485,8 @@ $a->strings["Disallow public access to addons listed in the apps menu."] = "Öff
$a->strings["Checking this box will restrict addons listed in the apps menu to members only."] = "Wenn ausgewählt werden die im Apps Menü aufgeführten Addons nur angemeldeten Nutzern der Seite zur Verfügung gestellt."; $a->strings["Checking this box will restrict addons listed in the apps menu to members only."] = "Wenn ausgewählt werden die im Apps Menü aufgeführten Addons nur angemeldeten Nutzern der Seite zur Verfügung gestellt.";
$a->strings["Don't embed private images in posts"] = "Private Bilder nicht in Beiträgen einbetten."; $a->strings["Don't embed private images in posts"] = "Private Bilder nicht in Beiträgen einbetten.";
$a->strings["Don't replace locally-hosted private photos in posts with an embedded copy of the image. This means that contacts who receive posts containing private photos will have to authenticate and load each image, which may take a while."] = "Ersetze lokal gehostete private Fotos in Beiträgen nicht mit einer eingebetteten Kopie des Bildes. Dies bedeutet, dass Kontakte, die Beiträge mit privaten Fotos erhalten sich zunächst auf den jeweiligen Servern authentifizieren müssen bevor die Bilder geladen und angezeigt werden, was eine gewisse Zeit dauert."; $a->strings["Don't replace locally-hosted private photos in posts with an embedded copy of the image. This means that contacts who receive posts containing private photos will have to authenticate and load each image, which may take a while."] = "Ersetze lokal gehostete private Fotos in Beiträgen nicht mit einer eingebetteten Kopie des Bildes. Dies bedeutet, dass Kontakte, die Beiträge mit privaten Fotos erhalten sich zunächst auf den jeweiligen Servern authentifizieren müssen bevor die Bilder geladen und angezeigt werden, was eine gewisse Zeit dauert.";
$a->strings["Allow Users to set remote_self"] = "Nutzern erlauben das remote_self Flag zu setzen";
$a->strings["With checking this, every user is allowed to mark every contact as a remote_self in the repair contact dialog. Setting this flag on a contact causes mirroring every posting of that contact in the users stream."] = "Ist dies ausgewählt kann jeder Nutzer jeden seiner Kontakte als remote_self (entferntes Konto) im Kontakt reparieren Dialog markieren. Nach dem setzten dieses Flags werden alle Top-Level Beiträge dieser Kontakte automatisch in den Stream dieses Nutzers gepostet.";
$a->strings["Block multiple registrations"] = "Unterbinde Mehrfachregistrierung"; $a->strings["Block multiple registrations"] = "Unterbinde Mehrfachregistrierung";
$a->strings["Disallow users to register additional accounts for use as pages."] = "Benutzern nicht erlauben, weitere Konten als zusätzliche Profile anzulegen."; $a->strings["Disallow users to register additional accounts for use as pages."] = "Benutzern nicht erlauben, weitere Konten als zusätzliche Profile anzulegen.";
$a->strings["OpenID support"] = "OpenID Unterstützung"; $a->strings["OpenID support"] = "OpenID Unterstützung";
@ -649,6 +651,9 @@ $a->strings["Friend Confirm URL"] = "URL für Bestätigungen von Freundschaftsan
$a->strings["Notification Endpoint URL"] = "URL-Endpunkt für Benachrichtigungen"; $a->strings["Notification Endpoint URL"] = "URL-Endpunkt für Benachrichtigungen";
$a->strings["Poll/Feed URL"] = "Pull/Feed-URL"; $a->strings["Poll/Feed URL"] = "Pull/Feed-URL";
$a->strings["New photo from this URL"] = "Neues Foto von dieser URL"; $a->strings["New photo from this URL"] = "Neues Foto von dieser URL";
$a->strings["Remote Self"] = "Entfernte Konten";
$a->strings["Mirror postings from this contact"] = "Spiegle Beiträge dieses Kontakts";
$a->strings["Mark this contact as remote_self, this will cause friendica to repost new entries from this contact."] = "Markiere diesen Kontakt als remote_self (entferntes Konto), dies veranlasst Friendica alle Top-Level Beiträge dieses Kontakts an all deine Kontakte zu senden.";
$a->strings["Move account"] = "Account umziehen"; $a->strings["Move account"] = "Account umziehen";
$a->strings["You can import an account from another Friendica server."] = "Du kannst einen Account von einem anderen Friendica Server importieren."; $a->strings["You can import an account from another Friendica server."] = "Du kannst einen Account von einem anderen Friendica Server importieren.";
$a->strings["You need to export your account from the old server and upload it here. We will recreate your old account here with all your contacts. We will try also to inform your friends that you moved here."] = "Du musst deinen Account vom alten Server exportieren und hier hochladen. Wir stellen deinen alten Account mit all deinen Kontakten wieder her. Wir werden auch versuchen all deine Freunde darüber zu informieren, dass du hierher umgezogen bist."; $a->strings["You need to export your account from the old server and upload it here. We will recreate your old account here with all your contacts. We will try also to inform your friends that you moved here."] = "Du musst deinen Account vom alten Server exportieren und hier hochladen. Wir stellen deinen alten Account mit all deinen Kontakten wieder her. Wir werden auch versuchen all deine Freunde darüber zu informieren, dass du hierher umgezogen bist.";
@ -708,6 +713,10 @@ $a->strings["Your Identity Address:"] = "Adresse deines Profils:";
$a->strings["Submit Request"] = "Anfrage abschicken"; $a->strings["Submit Request"] = "Anfrage abschicken";
$a->strings["[Embedded content - reload page to view]"] = "[Eingebetteter Inhalt - Seite neu laden zum Betrachten]"; $a->strings["[Embedded content - reload page to view]"] = "[Eingebetteter Inhalt - Seite neu laden zum Betrachten]";
$a->strings["View in context"] = "Im Zusammenhang betrachten"; $a->strings["View in context"] = "Im Zusammenhang betrachten";
$a->strings["%d contact edited."] = array(
0 => "%d Kontakt bearbeitet.",
1 => "%d Kontakte bearbeitet",
);
$a->strings["Could not access contact record."] = "Konnte nicht auf die Kontaktdaten zugreifen."; $a->strings["Could not access contact record."] = "Konnte nicht auf die Kontaktdaten zugreifen.";
$a->strings["Could not locate selected profile."] = "Konnte das ausgewählte Profil nicht finden."; $a->strings["Could not locate selected profile."] = "Konnte das ausgewählte Profil nicht finden.";
$a->strings["Contact updated."] = "Kontakt aktualisiert."; $a->strings["Contact updated."] = "Kontakt aktualisiert.";
@ -779,6 +788,7 @@ $a->strings["is a fan of yours"] = "ist ein Fan von dir";
$a->strings["you are a fan of"] = "du bist Fan von"; $a->strings["you are a fan of"] = "du bist Fan von";
$a->strings["Edit contact"] = "Kontakt bearbeiten"; $a->strings["Edit contact"] = "Kontakt bearbeiten";
$a->strings["Search your contacts"] = "Suche in deinen Kontakten"; $a->strings["Search your contacts"] = "Suche in deinen Kontakten";
$a->strings["Update"] = "Aktualisierungen";
$a->strings["everybody"] = "jeder"; $a->strings["everybody"] = "jeder";
$a->strings["Account settings"] = "Kontoeinstellungen"; $a->strings["Account settings"] = "Kontoeinstellungen";
$a->strings["Additional features"] = "Zusätzliche Features"; $a->strings["Additional features"] = "Zusätzliche Features";
@ -789,7 +799,6 @@ $a->strings["Connected apps"] = "Verbundene Programme";
$a->strings["Export personal data"] = "Persönliche Daten exportieren"; $a->strings["Export personal data"] = "Persönliche Daten exportieren";
$a->strings["Remove account"] = "Konto löschen"; $a->strings["Remove account"] = "Konto löschen";
$a->strings["Missing some important data!"] = "Wichtige Daten fehlen!"; $a->strings["Missing some important data!"] = "Wichtige Daten fehlen!";
$a->strings["Update"] = "Aktualisierungen";
$a->strings["Failed to connect with email account using the settings provided."] = "Verbindung zum E-Mail-Konto mit den angegebenen Einstellungen nicht möglich."; $a->strings["Failed to connect with email account using the settings provided."] = "Verbindung zum E-Mail-Konto mit den angegebenen Einstellungen nicht möglich.";
$a->strings["Email settings updated."] = "E-Mail Einstellungen bearbeitet."; $a->strings["Email settings updated."] = "E-Mail Einstellungen bearbeitet.";
$a->strings["Features updated"] = "Features aktualisiert"; $a->strings["Features updated"] = "Features aktualisiert";
@ -1289,6 +1298,8 @@ $a->strings["Categories"] = "Kategorien";
$a->strings["Click here to upgrade."] = "Zum Upgraden hier klicken."; $a->strings["Click here to upgrade."] = "Zum Upgraden hier klicken.";
$a->strings["This action exceeds the limits set by your subscription plan."] = "Diese Aktion überschreitet die Obergrenze deines Abonnements."; $a->strings["This action exceeds the limits set by your subscription plan."] = "Diese Aktion überschreitet die Obergrenze deines Abonnements.";
$a->strings["This action is not available under your subscription plan."] = "Diese Aktion ist in deinem Abonnement nicht verfügbar."; $a->strings["This action is not available under your subscription plan."] = "Diese Aktion ist in deinem Abonnement nicht verfügbar.";
$a->strings["User not found."] = "Nutzer nicht gefunden.";
$a->strings["There is no status with this id."] = "Es gibt keinen Status mit dieser ID.";
$a->strings["view full size"] = "Volle Größe anzeigen"; $a->strings["view full size"] = "Volle Größe anzeigen";
$a->strings["Starts:"] = "Beginnt:"; $a->strings["Starts:"] = "Beginnt:";
$a->strings["Finishes:"] = "Endet:"; $a->strings["Finishes:"] = "Endet:";

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,8 +1,4 @@
{{*
* AUTOMATICALLY GENERATED TEMPLATE
* DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
*
*}}
<div id="acl-wrapper"> <div id="acl-wrapper">
<input id="acl-search"> <input id="acl-search">
<a href="#" id="acl-showall">{{$showall}}</a> <a href="#" id="acl-showall">{{$showall}}</a>
@ -24,7 +20,8 @@ $(document).ready(function() {
if(typeof acl=="undefined"){ if(typeof acl=="undefined"){
acl = new ACL( acl = new ACL(
baseurl+"/acl", baseurl+"/acl",
[ {{$allowcid}},{{$allowgid}},{{$denycid}},{{$denygid}} ] [ {{$allowcid}},{{$allowgid}},{{$denycid}},{{$denygid}} ],
{{$features.aclautomention}}
); );
} }
}); });

View file

@ -89,6 +89,7 @@
{{include file="field_checkbox.tpl" field=$enotify_no_content}} {{include file="field_checkbox.tpl" field=$enotify_no_content}}
{{include file="field_checkbox.tpl" field=$private_addons}} {{include file="field_checkbox.tpl" field=$private_addons}}
{{include file="field_checkbox.tpl" field=$disable_embedded}} {{include file="field_checkbox.tpl" field=$disable_embedded}}
{{include file="field_checkbox.tpl" field=$allow_users_remote_self}}
<div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div> <div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>
<h3>{{$advanced}}</h3> <h3>{{$advanced}}</h3>

View file

@ -1,8 +1,3 @@
{{*
* AUTOMATICALLY GENERATED TEMPLATE
* DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
*
*}}
<div class="contact-entry-wrapper" id="contact-entry-wrapper-{{$contact.id}}" > <div class="contact-entry-wrapper" id="contact-entry-wrapper-{{$contact.id}}" >
<div class="contact-entry-photo-wrapper" > <div class="contact-entry-photo-wrapper" >
@ -12,15 +7,16 @@
<a href="{{$contact.url}}" title="{{$contact.img_hover}}" /><img src="{{$contact.thumb}}" {{$contact.sparkle}} alt="{{$contact.name}}" /></a> <a href="{{$contact.url}}" title="{{$contact.img_hover}}" /><img src="{{$contact.thumb}}" {{$contact.sparkle}} alt="{{$contact.name}}" /></a>
<input type="checkbox" class="contact-select" name="contact_batch[]" value="{{$contact.id}}">
{{if $contact.photo_menu}} {{if $contact.photo_menu}}
<span onclick="openClose('contact-photo-menu-{{$contact.id}}');" class="fakelink contact-photo-menu-button" id="contact-photo-menu-button-{{$contact.id}}">menu</span> <span onclick="openClose('contact-photo-menu-{{$contact.id}}');" class="fakelink contact-photo-menu-button" id="contact-photo-menu-button-{{$contact.id}}">menu</span>
<div class="contact-photo-menu" id="contact-photo-menu-{{$contact.id}}"> <div class="contact-photo-menu" id="contact-photo-menu-{{$contact.id}}">
<ul> <ul>
{{foreach $contact.photo_menu as $c}} {{foreach $contact.photo_menu as $k=>$c}}
{{if $c.2}} {{if $c.2}}
<li><a target="redir" href="{{$c.1}}">{{$c.0}}</a></li> <li><a class="{{$k}}" target="redir" href="{{$c.1}}">{{$c.0}}</a></li>
{{else}} {{else}}
<li><a href="{{$c.1}}">{{$c.0}}</a></li> <li><a class="{{$k}}" href="{{$c.1}}">{{$c.0}}</a></li>
{{/if}} {{/if}}
{{/foreach}} {{/foreach}}
</ul> </ul>

View file

@ -1,8 +1,4 @@
{{*
* AUTOMATICALLY GENERATED TEMPLATE
* DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
*
*}}
<h1>{{$header}}{{if $total}} ({{$total}}){{/if}}</h1> <h1>{{$header}}{{if $total}} ({{$total}}){{/if}}</h1>
{{if $finding}}<h4>{{$finding}}</h4>{{/if}} {{if $finding}}<h4>{{$finding}}</h4>{{/if}}
@ -18,11 +14,44 @@
{{$tabs}} {{$tabs}}
<form action="{{$baseurl}}/contacts/batch/" method="POST">
{{foreach $contacts as $contact}} {{foreach $contacts as $contact}}
{{include file="contact_template.tpl"}} {{include file="contact_template.tpl"}}
{{/foreach}} {{/foreach}}
<div id="contact-edit-end"></div> <div id="contact-edit-end"></div>
<div id="contats-actions">
{{foreach $batch_actions as $n=>$l}}
<input class="batch-action" name="{{$n}}" value="{{$l}}" type="submit">
{{/foreach}}
</div>
</form>
<script>
$(document).ready(function() {
// javascript dialog to batch actions
$(".batch-action").click(function(e){
if (confirm($(this).attr('value')+" ?")) {
return true;
} else {
e.preventDefault();
return false;
}
});
// add javascript confirm dialog to "drop" links. Plain html url have "?confirm=1" to show confirmation form, we need to remove it
$(".drop").each(function() {
$(this).attr('href', $(this).attr('href').replace("confirm=1","") );
$(this).click(function(e){
if (confirm("{{$contact_drop_confirm}}")) {
return true;
} else {
e.preventDefault();
return false;
}
});
});
});
</script>
{{$paginate}} {{$paginate}}

View file

@ -1,9 +1,3 @@
{{*
* AUTOMATICALLY GENERATED TEMPLATE
* DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
*
*}}
<form id="crepair-form" action="crepair/{{$contact_id}}" method="post" > <form id="crepair-form" action="crepair/{{$contact_id}}" method="post" >
<h4>{{$contact_name}}</h4> <h4>{{$contact_name}}</h4>
@ -43,6 +37,10 @@
<label id="crepair-photo-label" class="crepair-label" for="crepair-photo">{{$label_photo}}</label> <label id="crepair-photo-label" class="crepair-label" for="crepair-photo">{{$label_photo}}</label>
<input type="text" id="crepair-photo" class="crepair-input" name="photo" value="" /> <input type="text" id="crepair-photo" class="crepair-input" name="photo" value="" />
<div class="clear"></div> <div class="clear"></div>
{{if $allow_remote_self eq 1}}
<h4>{{$label_remote_self}}</h4>
{{include file="field_checkbox.tpl" field=$remote_self}}
{{/if}}
{{include file="field_checkbox.tpl" field=$contact_self}} {{include file="field_checkbox.tpl" field=$contact_self}}

View file

@ -91,6 +91,7 @@ nav {
display: block; display: block;
margin: 0px 10%; margin: 0px 10%;
border-bottom: 1px solid #babdb6; border-bottom: 1px solid #babdb6;
position: relative;
} }
nav #site-location { nav #site-location {
color: #888a85; color: #888a85;
@ -1616,6 +1617,9 @@ input#dfrn-url {
margin-top: 20px; margin-top: 20px;
} }
.contact-select { position: absolute; top: 64px; left:64px; display:none; }
.contact-select:checked,
.contact-entry-photo:hover .contact-select { display:block; }
.contact-photo-menu-button { .contact-photo-menu-button {
position: absolute; position: absolute;
@ -2905,6 +2909,8 @@ aside input[type='text'] {
.field.radio .field_help { margin-left: 0px; } .field.radio .field_help { margin-left: 0px; }
/** /**
* ADMIN * ADMIN
*/ */
@ -3252,7 +3258,7 @@ ul.menu-popup {
list-style: none; list-style: none;
z-index: 100000; z-index: 100000;
top: 90px; top: 90px;
left: 400px; left: 200px;
} }
#nav-notifications-menu { #nav-notifications-menu {
width: 320px; width: 320px;
@ -3328,3 +3334,63 @@ ul.menu-popup {
.shared_header span { .shared_header span {
margin-left: 10px; margin-left: 10px;
} }
/* small screens */
@media all and (max-width: 1089px) {
.field label { width: 90%; }
.field input, .field textarea, .field select { width: 90%; }
.field input[type="checkbox"],.field input[type="radio"] {
width: 2em;
}
#id_openid_url { width: 85%; }
.field_help { margin-left: 0px; }
textarea { width: 100%; }
}
@media all and (max-width: 760px) {
body { background-image: none; }
nav, aside, section, footer {
margin: 0px;
float: none;
position: relative;
width: 100%;
padding: 0.5em;
height: auto;
}
aside:before {
content: ">>";
display: block;
background-color: #eee;
}
aside { overflow: hidden; min-height: 0; height: 1em;}
aside:hover, aside:focus { height: auto; }
nav .nav-link {
float: left;
width: 23%;
min-width: 100px;
height: 15px;
display: block;
margin: 0.4em 2px 0 0;
padding: 6px 3px;
border-width: 1px 1px 0px;
border-style: solid solid none;
border-color: rgb(186, 189, 182);
background-color: rgb(174, 192,211)!important;
}
.nav-commlink.selected,
.nav-commlink {
border-bottom: 0px;
padding: 6px 3px;
min-width: 100px;
float: left;
margin-top: 0.4em;
width: 23%;
bottom: auto;
}
.nav-ajax-left {margin-left: -1em; margin-top: 0px; }
nav #site-location,
nav #banner { position: relative; clear:both; }
ul.menu-popup { left: 0px; top 20px; }
}

View file

@ -1349,6 +1349,19 @@ span[id^="showmore-wrap"] {
.contact-photo-wrapper { .contact-photo-wrapper {
position: relative; position: relative;
} }
.contact-select {
position: absolute;
top: 64px;
left: 64px;
display: none;
}
.contact-select:checked,
.contact-photo:hover .contact-select {
display: block;
}
#contats-actions {
clear: both;
}
.contact-photo { .contact-photo {
width: 48px; width: 48px;
height: 48px; height: 48px;

View file

@ -1349,6 +1349,19 @@ span[id^="showmore-wrap"] {
.contact-photo-wrapper { .contact-photo-wrapper {
position: relative; position: relative;
} }
.contact-select {
position: absolute;
top: 64px;
left: 64px;
display: none;
}
.contact-select:checked,
.contact-photo:hover .contact-select {
display: block;
}
#contats-actions {
clear: both;
}
.contact-photo { .contact-photo {
width: 48px; width: 48px;
height: 48px; height: 48px;

View file

@ -1349,6 +1349,19 @@ span[id^="showmore-wrap"] {
.contact-photo-wrapper { .contact-photo-wrapper {
position: relative; position: relative;
} }
.contact-select {
position: absolute;
top: 64px;
left: 64px;
display: none;
}
.contact-select:checked,
.contact-photo:hover .contact-select {
display: block;
}
#contats-actions {
clear: both;
}
.contact-photo { .contact-photo {
width: 48px; width: 48px;
height: 48px; height: 48px;

View file

@ -528,6 +528,7 @@ section {
.contact-photo { .contact-photo {
width: 32px; height: 32px; width: 32px; height: 32px;
} }
.contact-photo-menu-button { .contact-photo-menu-button {
top: 15px !important; top: 15px !important;
left: 0px !important; left: 0px !important;
@ -738,6 +739,10 @@ span[id^="showmore-wrap"] {
.contact-photo-wrapper { position: relative; } .contact-photo-wrapper { position: relative; }
.contact-select { position: absolute; top:64px; left:64px; display:none; }
.contact-select:checked,
.contact-photo:hover .contact-select { display:block; }
#contats-actions { clear: both; }
.contact-photo { .contact-photo {
width: 48px; height: 48px; width: 48px; height: 48px;
img { width: 48px; height: 48px; } img { width: 48px; height: 48px; }

View file

@ -1,8 +1,3 @@
{{*
* AUTOMATICALLY GENERATED TEMPLATE
* DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
*
*}}
<div class="contact-wrapper" id="contact-entry-wrapper-{{$id}}" > <div class="contact-wrapper" id="contact-entry-wrapper-{{$id}}" >
<div class="contact-photo-wrapper" > <div class="contact-photo-wrapper" >
@ -12,6 +7,7 @@
<a href="{{$contact.url}}" title="{{$contact.img_hover}}" /><img src="{{$contact.thumb}}" {{$contact.sparkle}} alt="{{$contact.name}}" /></a> <a href="{{$contact.url}}" title="{{$contact.img_hover}}" /><img src="{{$contact.thumb}}" {{$contact.sparkle}} alt="{{$contact.name}}" /></a>
<input type="checkbox" class="contact-select" name="contact_batch[]" value="{{$contact.id}}">
{{if $contact.photo_menu}} {{if $contact.photo_menu}}
<a href="#" rel="#contact-photo-menu-{{$contact.id}}" class="contact-photo-menu-button icon s16 menu" id="contact-photo-menu-button-{{$contact.id}}">menu</a> <a href="#" rel="#contact-photo-menu-{{$contact.id}}" class="contact-photo-menu-button icon s16 menu" id="contact-photo-menu-button-{{$contact.id}}">menu</a>
<ul class="contact-photo-menu menu-popup" id="contact-photo-menu-{{$contact.id}}"> <ul class="contact-photo-menu menu-popup" id="contact-photo-menu-{{$contact.id}}">

View file

@ -291,7 +291,9 @@ blockquote.shared_content {
body { body {
font-family: 'Lato', "Helvetica Neue", Helvetica, Arial, sans-serif; font-family: 'Lato', "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 14px; font-size: 14px;
background-color: #ffffff; /* background-color: #ffffff; */
background-color: #FAFAFA;
/* background-color: rgb(252, 252, 252); */
color: #2d2d2d; color: #2d2d2d;
margin: 0px 0px 0px 0px; margin: 0px 0px 0px 0px;
display: table; display: table;
@ -1087,7 +1089,9 @@ section {
width: 766px; width: 766px;
max-width: 766px; max-width: 766px;
padding: 10px 10px 10px 10px; padding: 10px 10px 10px 10px;
background-color: white; /* background-color: white; */
/* background-color: rgb(252, 252, 252); */
background-color: #FAFAFA;
border-bottom: 1px solid lightgray; border-bottom: 1px solid lightgray;
border-right: 1px solid lightgray; border-right: 1px solid lightgray;
border-left: 1px solid lightgray; border-left: 1px solid lightgray;
@ -1410,6 +1414,31 @@ border-bottom: 1px solid #D2D2D2;
padding-right: 12px; */ padding-right: 12px; */
} }
.twit {
background-color: #FFFAFA;
}
.pump {
background-color: #FAFFFA;
}
.face {
background-color: #FAFAFF;
}
.feed {
background-color: #FFFFFA;
}
.dspr {
background-color: #FFFAFF;
}
.dfrn {
background-color: #FAFFFF;
}
.stat {
background-color: #FAFAFA;
}
.mail {
background-color: #FFFFF9;
}
#profile-jot-form #profile-jot-text { #profile-jot-form #profile-jot-text {
height: 2.0em; height: 2.0em;
/* width: 99%; */ /* width: 99%; */

View file

@ -7,7 +7,7 @@
{{foreach $threads as $thread}} {{foreach $threads as $thread}}
<div id="tread-wrapper-{{$thread.id}}" class="tread-wrapper {{if $thread.threaded}}threaded{{/if}} {{$thread.toplevel}}"> <div id="tread-wrapper-{{$thread.id}}" class="tread-wrapper {{if $thread.threaded}}threaded{{/if}} {{$thread.toplevel}} {{$thread.network}}">
{{if $thread.type == tag}} {{if $thread.type == tag}}

View file

@ -32,7 +32,7 @@
<img id="like-rotator-{{$item.id}}" class="like-rotator" src="images/rotator.gif" alt="{{$item.wait}}" title="{{$item.wait}}" style="display: none;" /> <img id="like-rotator-{{$item.id}}" class="like-rotator" src="images/rotator.gif" alt="{{$item.wait}}" title="{{$item.wait}}" style="display: none;" />
</div> </div>
<div class="wall-item-container {{$item.indent}} {{$item.shiny}} " id="item-{{$item.id}}"> <div class="wall-item-container {{$item.indent}} {{$item.shiny}} {{$item.network}}" id="item-{{$item.id}}">
<div class="wall-item-item"> <div class="wall-item-item">
<div class="wall-item-info"> <div class="wall-item-info">
<div class="contact-photo-wrapper mframe{{if $item.owner_url}} wwfrom{{/if}}" <div class="contact-photo-wrapper mframe{{if $item.owner_url}} wwfrom{{/if}}"