diff --git a/boot.php b/boot.php index 5b7b60480..49247eb23 100644 --- a/boot.php +++ b/boot.php @@ -4,7 +4,7 @@ set_time_limit(0); ini_set('pcre.backtrack_limit', 250000); -define ( 'FRIENDIKA_VERSION', '2.2.1011' ); +define ( 'FRIENDIKA_VERSION', '2.2.1012' ); define ( 'DFRN_PROTOCOL_VERSION', '2.21' ); define ( 'DB_UPDATE_VERSION', 1063 ); diff --git a/include/conversation.php b/include/conversation.php index 9ffcbe157..0d3123831 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -114,6 +114,8 @@ function conversation(&$a, $items, $mode, $update) { $noshare_tpl = get_markup_template('like_noshare.tpl'); $tpl = get_markup_template('wall_item.tpl'); $wallwall = get_markup_template('wallwall_item.tpl'); + $droptpl = get_markup_template('wall_item_drop.tpl'); + $fakedrop = get_markup_template('wall_fake_drop.tpl'); $alike = array(); $dlike = array(); @@ -126,7 +128,6 @@ function conversation(&$a, $items, $mode, $update) { // - just loop through the items and format them minimally for display $tpl = get_markup_template('search_item.tpl'); - $droptpl = get_markup_template('wall_fake_drop.tpl'); foreach($items as $item) { @@ -171,14 +172,7 @@ function conversation(&$a, $items, $mode, $update) { } $drop = ''; - $dropping = false; - if((intval($item['contact-id']) && $item['contact-id'] == remote_user()) || ($item['uid'] == local_user())) - $dropping = true; - - $drop = replace_macros((($dropping)? $droptpl : $fakedrop), array('$id' => $item['id'], '$delete' => t('Delete'))); - - // localize_item($item); $drop = replace_macros($droptpl,array('$id' => $item['id'])); @@ -390,7 +384,16 @@ function conversation(&$a, $items, $mode, $update) { ? '' : ''); - $drop = replace_macros(get_markup_template('wall_item_drop.tpl'), array('$id' => $item['id'], '$delete' => t('Delete'))); + + + $drop = ''; + $dropping = false; + + if((intval($item['contact-id']) && $item['contact-id'] == remote_user()) || ($item['uid'] == local_user())) + $dropping = true; + + $drop = replace_macros((($dropping)? $droptpl : $fakedrop), array('$id' => $item['id'], '$delete' => t('Delete'))); + $photo = $item['photo']; $thumb = $item['thumb']; @@ -477,6 +480,7 @@ function conversation(&$a, $items, $mode, $update) { '$comment' => $comment )); + $arr = array('item' => $item, 'output' => $tmp_item); call_hooks('display_item', $arr); @@ -491,6 +495,9 @@ function conversation(&$a, $items, $mode, $update) { if($blowhard_count >= 3) $o .= ''; + if($dropping) + $o .= '
'; + return $o; } diff --git a/include/items.php b/include/items.php index dc177c468..a003b84bb 100644 --- a/include/items.php +++ b/include/items.php @@ -1772,3 +1772,129 @@ function item_expire($uid,$days) { } + +function drop_items($items) { + $uid = 0; + + if(count($items)) { + foreach($items as $item) { + $owner = drop_item($item,false); + if($owner && ! $uid) + $uid = $owner; + } + } + + // multiple threads may have been deleted, send an expire notification + + if($uid) + proc_run('php',"include/notifier.php","expire","$uid"); +} + + +function drop_item($id,$interactive = true) { + + $a = get_app(); + + // locate item to be deleted + + $r = q("SELECT * FROM `item` WHERE `id` = %d LIMIT 1", + intval($id) + ); + + if(! count($r)) { + if(! $interactive) + return 0; + notice( t('Item not found.') . EOL); + goaway($a->get_baseurl() . '/' . $_SESSION['return_url']); + } + + $item = $r[0]; + + $owner = $item['uid']; + + // check if logged in user is either the author or owner of this item + + if((local_user() == $item['uid']) || (remote_user() == $item['contact-id'])) { + + // delete the item + + $r = q("UPDATE `item` SET `deleted` = 1, `body` = '', `edited` = '%s', `changed` = '%s' WHERE `id` = %d LIMIT 1", + dbesc(datetime_convert()), + dbesc(datetime_convert()), + intval($item['id']) + ); + + // If item is a link to a photo resource, nuke all the associated photos + // (visitors will not have photo resources) + // This only applies to photos uploaded from the photos page. Photos inserted into a post do not + // generate a resource-id and therefore aren't intimately linked to the item. + + if(strlen($item['resource-id'])) { + q("DELETE FROM `photo` WHERE `resource-id` = '%s' AND `uid` = %d ", + dbesc($item['resource-id']), + intval($item['uid']) + ); + // ignore the result + } + + // If item is a link to an event, nuke the event record. + + if(intval($item['event-id'])) { + q("DELETE FROM `event` WHERE `id` = %d AND `uid` = %d LIMIT 1", + intval($item['event-id']), + intval($item['uid']) + ); + // ignore the result + } + + + // If it's the parent of a comment thread, kill all the kids + + if($item['uri'] == $item['parent-uri']) { + $r = q("UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s', `body` = '' + WHERE `parent-uri` = '%s' AND `uid` = %d ", + dbesc(datetime_convert()), + dbesc(datetime_convert()), + dbesc($item['parent-uri']), + intval($item['uid']) + ); + // ignore the result + } + else { + // ensure that last-child is set in case the comment that had it just got wiped. + q("UPDATE `item` SET `last-child` = 0, `changed` = '%s' WHERE `parent-uri` = '%s' AND `uid` = %d ", + dbesc(datetime_convert()), + dbesc($item['parent-uri']), + intval($item['uid']) + ); + // who is the last child now? + $r = q("SELECT `id` FROM `item` WHERE `parent-uri` = '%s' AND `type` != 'activity' AND `deleted` = 0 AND `uid` = %d ORDER BY `edited` DESC LIMIT 1", + dbesc($item['parent-uri']), + intval($item['uid']) + ); + if(count($r)) { + q("UPDATE `item` SET `last-child` = 1 WHERE `id` = %d LIMIT 1", + intval($r[0]['id']) + ); + } + } + $drop_id = intval($item['id']); + + // send the notification upstream/downstream as the case may be + + if(! $interactive) + return $owner; + + proc_run('php',"include/notifier.php","drop","$drop_id"); + goaway($a->get_baseurl() . '/' . $_SESSION['return_url']); + //NOTREACHED + } + else { + if(! $interactive) + return 0; + notice( t('Permission denied.') . EOL); + goaway($a->get_baseurl() . '/' . $_SESSION['return_url']); + //NOTREACHED + } + +} \ No newline at end of file diff --git a/include/main.js b/include/main.js index 34045f57f..18cb55328 100644 --- a/include/main.js +++ b/include/main.js @@ -47,26 +47,6 @@ $('#pause').html(''); } } -// // F8 - show/hide language selector -// if(event.keyCode == '119') { -// if(langSelect) { -// langSelect = false; -// $('#language-selector').hide(); -// } -// else { -// langSelect = true; -// $('#language-selector').show(); -// } -// } -// -// this is shift-home on FF, but $ on IE, disabling until I figure out why the diff. -// update: incompatible usage of onKeyDown vs onKeyPress -// if(event.keyCode == '36' && event.shiftKey == true) { -// if(homebase !== undefined) { -// event.preventDefault(); -// document.location = homebase; -// } -// } }); }); diff --git a/mod/item.php b/mod/item.php index 776c0dcc2..98f4ff90c 100644 --- a/mod/item.php +++ b/mod/item.php @@ -22,6 +22,15 @@ function item_post(&$a) { $uid = local_user(); + if(x($_POST,'dropitems')) { + require_once('include/items.php'); + $arr_drop = explode(',',$_POST['dropitems']); + drop_items($arr_drop); + $json = array('success' => 1); + echo json_encode($json); + killme(); + } + call_hooks('post_local_start', $_POST); $parent = ((x($_POST,'parent')) ? intval($_POST['parent']) : 0); @@ -735,102 +744,8 @@ function item_content(&$a) { require_once('include/security.php'); - $uid = local_user(); - if(($a->argc == 3) && ($a->argv[1] === 'drop') && intval($a->argv[2])) { - - // locate item to be deleted - - $r = q("SELECT * FROM `item` WHERE `id` = %d LIMIT 1", - intval($a->argv[2]) - ); - - if(! count($r)) { - notice( t('Item not found.') . EOL); - goaway($a->get_baseurl() . '/' . $_SESSION['return_url']); - } - $item = $r[0]; - - // check if logged in user is either the author or owner of this item - - if(($_SESSION['visitor_id'] == $item['contact-id']) || ($_SESSION['uid'] == $item['uid'])) { - - // delete the item - - $r = q("UPDATE `item` SET `deleted` = 1, `body` = '', `edited` = '%s', `changed` = '%s' WHERE `id` = %d LIMIT 1", - dbesc(datetime_convert()), - dbesc(datetime_convert()), - intval($item['id']) - ); - - // If item is a link to a photo resource, nuke all the associated photos - // (visitors will not have photo resources) - // This only applies to photos uploaded from the photos page. Photos inserted into a post do not - // generate a resource-id and therefore aren't intimately linked to the item. - - if(strlen($item['resource-id'])) { - q("DELETE FROM `photo` WHERE `resource-id` = '%s' AND `uid` = %d ", - dbesc($item['resource-id']), - intval($item['uid']) - ); - // ignore the result - } - - // If item is a link to an event, nuke the event record. - - if(intval($item['event-id'])) { - q("DELETE FROM `event` WHERE `id` = %d AND `uid` = %d LIMIT 1", - intval($item['event-id']), - intval($item['uid']) - ); - // ignore the result - } - - - // If it's the parent of a comment thread, kill all the kids - - if($item['uri'] == $item['parent-uri']) { - $r = q("UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s', `body` = '' - WHERE `parent-uri` = '%s' AND `uid` = %d ", - dbesc(datetime_convert()), - dbesc(datetime_convert()), - dbesc($item['parent-uri']), - intval($item['uid']) - ); - // ignore the result - } - else { - // ensure that last-child is set in case the comment that had it just got wiped. - q("UPDATE `item` SET `last-child` = 0, `changed` = '%s' WHERE `parent-uri` = '%s' AND `uid` = %d ", - dbesc(datetime_convert()), - dbesc($item['parent-uri']), - intval($item['uid']) - ); - // who is the last child now? - $r = q("SELECT `id` FROM `item` WHERE `parent-uri` = '%s' AND `type` != 'activity' AND `deleted` = 0 AND `uid` = %d ORDER BY `edited` DESC LIMIT 1", - dbesc($item['parent-uri']), - intval($item['uid']) - ); - if(count($r)) { - q("UPDATE `item` SET `last-child` = 1 WHERE `id` = %d LIMIT 1", - intval($r[0]['id']) - ); - } - } - $drop_id = intval($item['id']); - - // send the notification upstream/downstream as the case may be - - proc_run('php',"include/notifier.php","drop","$drop_id"); -// We seem to lose the return url occasionally. Have not been able to reliably duplicate -// logger('drop_return_url: ' . $_SESSION['return_url']); - goaway($a->get_baseurl() . '/' . $_SESSION['return_url']); - //NOTREACHED - } - else { - notice( t('Permission denied.') . EOL); - goaway($a->get_baseurl() . '/' . $_SESSION['return_url']); - //NOTREACHED - } + require_once('include/items.php'); + drop_item($a->argv[2]); } } diff --git a/mod/photos.php b/mod/photos.php index 717800364..e52f67008 100644 --- a/mod/photos.php +++ b/mod/photos.php @@ -1274,7 +1274,7 @@ function photos_content(&$a) { $drop = ''; if(($item['contact-id'] == remote_user()) || ($item['uid'] == local_user())) - $drop = replace_macros(get_markup_template('wall_item_drop.tpl'), array('$id' => $item['id'], '$delete' => t('Delete'))); + $drop = replace_macros(get_markup_template('photo_drop.tpl'), array('$id' => $item['id'], '$delete' => t('Delete'))); $comments .= replace_macros($template,array( diff --git a/mod/profile.php b/mod/profile.php index aeb21f077..587ac6288 100644 --- a/mod/profile.php +++ b/mod/profile.php @@ -261,11 +261,8 @@ function profile_content(&$a, $update = 0) { if($is_owner && ! $update) $o .= get_birthdays(); - - $o .= conversation($a,$r,'profile',$update); - if(! $update) { $o .= paginate($a); diff --git a/view/jot-header.tpl b/view/jot-header.tpl index 77e5bc4bc..61c80702e 100644 --- a/view/jot-header.tpl +++ b/view/jot-header.tpl @@ -109,6 +109,22 @@ tinyMCE.init({ }); + function deleteCheckedItems() { + var checkedstr = ''; + + $('.item-select').each( function() { + if($(this).is(':checked')) { + if(checkedstr.length != 0) + checkedstr = checkedstr + ',' + $(this).val(); + else + checkedstr = $(this).val(); + } + }); + $.post('item', { dropitems: checkedstr }, function(data) { + window.location.reload(); + }); + } + function jotGetLink() { reply = prompt("$linkurl"); if(reply && reply.length) { diff --git a/view/photo_drop.tpl b/view/photo_drop.tpl new file mode 100644 index 000000000..b4ea62b45 --- /dev/null +++ b/view/photo_drop.tpl @@ -0,0 +1,4 @@ +
+ +
+
diff --git a/view/theme/duepuntozero/style.css b/view/theme/duepuntozero/style.css index 155641463..3bf78346f 100644 --- a/view/theme/duepuntozero/style.css +++ b/view/theme/duepuntozero/style.css @@ -2489,8 +2489,32 @@ a.mail-list-link { margin-top: 10px; } +.item-select { + opacity: 0.3; + filter:alpha(opacity=30); + float: right; + margin-right: 10px; +} +.item-select:hover { + opacity: 1; + filter:alpha(opacity=100); +} +#item-delete-selected { + margin-top: 30px; +} + +#item-delete-selected-end { + clear: both; +} +#item-delete-selected-icon, #item-delete-selected-desc { + float: left; + margin-right: 5px; +} +#item-delete-selected-desc:hover { + text-decoration: underline; +} #lang-select-icon { cursor: pointer; diff --git a/view/theme/loozah/style.css b/view/theme/loozah/style.css index d70968a84..c07ef045a 100644 --- a/view/theme/loozah/style.css +++ b/view/theme/loozah/style.css @@ -2518,6 +2518,33 @@ a.mail-list-link { } +.item-select { + opacity: 0.3; + filter:alpha(opacity=30); + float: right; + margin-right: 10px; + +} +.item-select:hover { + opacity: 1; + filter:alpha(opacity=100); +} + +#item-delete-selected { + margin-top: 30px; +} + +#item-delete-selected-end { + clear: both; +} +#item-delete-selected-icon, #item-delete-selected-desc { + float: left; + margin-right: 5px; +} +#item-delete-selected-desc:hover { + text-decoration: underline; +} + #lang-select-icon { cursor: pointer; position: absolute; diff --git a/view/wall_item_drop.tpl b/view/wall_item_drop.tpl index b4ea62b45..b10c21093 100644 --- a/view/wall_item_drop.tpl +++ b/view/wall_item_drop.tpl @@ -1,4 +1,6 @@
+
+