diff --git a/mod/photos.php b/mod/photos.php index 137e0adb5..caacaf2ce 100644 --- a/mod/photos.php +++ b/mod/photos.php @@ -235,36 +235,12 @@ function photos_post(App $a) } /* - * DELETE photo album and all its photos + * DELETE all photos filed in a given album */ - - if ($_POST['dropalbum'] == L10n::t('Delete Album')) { - // Check if we should do HTML-based delete confirmation - if (!empty($_REQUEST['confirm'])) { - $drop_url = $a->query_string; - - $extra_inputs = [ - ['name' => 'albumname', 'value' => $_POST['albumname']], - ]; - - $a->page['content'] = Renderer::replaceMacros(Renderer::getMarkupTemplate('confirm.tpl'), [ - '$method' => 'post', - '$message' => L10n::t('Do you really want to delete this photo album and all its photos?'), - '$extra_inputs' => $extra_inputs, - '$confirm' => L10n::t('Delete Album'), - '$confirm_url' => $drop_url, - '$confirm_name' => 'dropalbum', // Needed so that confirmation will bring us back into this if statement - '$cancel' => L10n::t('Cancel'), - ]); - - $a->error = 1; // Set $a->error so the other module functions don't execute - return; - } - + if (!empty($_POST['dropalbum'])) { $res = []; // get the list of photos we are about to delete - if ($visitor) { $r = q("SELECT distinct(`resource-id`) as `rid` FROM `photo` WHERE `contact-id` = %d AND `uid` = %d AND `album` = '%s'", intval($visitor), @@ -282,77 +258,61 @@ function photos_post(App $a) foreach ($r as $rr) { $res[] = $rr['rid']; } + + // remove the associated photos + Photo::delete(['resource-id' => $res, 'uid' => $page_owner_uid]); + + // find and delete the corresponding item with all the comments and likes/dislikes + Item::deleteForUser(['resource-id' => $res, 'uid' => $page_owner_uid], $page_owner_uid); + + // Update the photo albums cache + Photo::clearAlbumCache($page_owner_uid); + notice(L10n::t('Album successfully deleted')); } else { - $a->internalRedirect($_SESSION['photo_return']); - return; // NOTREACHED + notice(L10n::t('Album was empty.')); + } + } + + $a->internalRedirect('photos/' . $a->argv[1]); + } + + if ($a->argc > 3 && $a->argv[2] === 'image') { + // Check if the user has responded to a delete confirmation query for a single photo + if (!empty($_POST['canceled'])) { + $a->internalRedirect('photos/' . $a->argv[1] . '/image/' . $a->argv[3]); + } + + if (!empty($_POST['delete'])) { + // same as above but remove single photo + if ($visitor) { + $r = q("SELECT `id`, `resource-id` FROM `photo` WHERE `contact-id` = %d AND `uid` = %d AND `resource-id` = '%s' LIMIT 1", + intval($visitor), + intval($page_owner_uid), + DBA::escape($a->argv[3]) + ); + } else { + $r = q("SELECT `id`, `resource-id` FROM `photo` WHERE `uid` = %d AND `resource-id` = '%s' LIMIT 1", + intval(local_user()), + DBA::escape($a->argv[3]) + ); } - // remove the associated photos - Photo::delete(['resource-id' => $res, 'uid' => $page_owner_uid]); + if (DBA::isResult($r)) { + Photo::delete(['uid' => $page_owner_uid, 'resource-id' => $r[0]['resource-id']]); - // find and delete the corresponding item with all the comments and likes/dislikes - Item::deleteForUser(['resource-id' => $res, 'uid' => $page_owner_uid], $page_owner_uid); + Item::deleteForUser(['resource-id' => $r[0]['resource-id'], 'uid' => $page_owner_uid], $page_owner_uid); - // Update the photo albums cache - Photo::clearAlbumCache($page_owner_uid); + // Update the photo albums cache + Photo::clearAlbumCache($page_owner_uid); + notice('Successfully deleted the photo.'); + } else { + notice('Failed to delete the photo.'); + $a->internalRedirect('photos/' . $a->argv[1] . '/image/' . $a->argv[3]); + } + + $a->internalRedirect('photos/' . $a->argv[1]); + return; // NOTREACHED } - - $a->internalRedirect('photos/' . $a->data['user']['nickname']); - return; // NOTREACHED - } - - - // Check if the user has responded to a delete confirmation query for a single photo - if ($a->argc > 2 && !empty($_REQUEST['canceled'])) { - $a->internalRedirect($_SESSION['photo_return']); - } - - if ($a->argc > 2 && defaults($_POST, 'delete', '') === L10n::t('Delete Photo')) { - - // same as above but remove single photo - - // Check if we should do HTML-based delete confirmation - if (!empty($_REQUEST['confirm'])) { - $drop_url = $a->query_string; - - $a->page['content'] = Renderer::replaceMacros(Renderer::getMarkupTemplate('confirm.tpl'), [ - '$method' => 'post', - '$message' => L10n::t('Do you really want to delete this photo?'), - '$extra_inputs' => [], - '$confirm' => L10n::t('Delete Photo'), - '$confirm_url' => $drop_url, - '$confirm_name' => 'delete', // Needed so that confirmation will bring us back into this if statement - '$cancel' => L10n::t('Cancel'), - ]); - - $a->error = 1; // Set $a->error so the other module functions don't execute - return; - } - - if ($visitor) { - $r = q("SELECT `id`, `resource-id` FROM `photo` WHERE `contact-id` = %d AND `uid` = %d AND `resource-id` = '%s' LIMIT 1", - intval($visitor), - intval($page_owner_uid), - DBA::escape($a->argv[2]) - ); - } else { - $r = q("SELECT `id`, `resource-id` FROM `photo` WHERE `uid` = %d AND `resource-id` = '%s' LIMIT 1", - intval(local_user()), - DBA::escape($a->argv[2]) - ); - } - - if (DBA::isResult($r)) { - Photo::delete(['uid' => $page_owner_uid, 'resource-id' => $r[0]['resource-id']]); - - Item::deleteForUser(['resource-id' => $r[0]['resource-id'], 'uid' => $page_owner_uid], $page_owner_uid); - - // Update the photo albums cache - Photo::clearAlbumCache($page_owner_uid); - } - - $a->internalRedirect('photos/' . $a->data['user']['nickname']); - return; // NOTREACHED } if ($a->argc > 2 && (!empty($_POST['desc']) || !empty($_POST['newtag']) || isset($_POST['albname']))) { @@ -896,8 +856,10 @@ function photos_content(App $a) // photos/name/upload/xxxxx (xxxxx is album name) // photos/name/album/xxxxx // photos/name/album/xxxxx/edit + // photos/name/album/xxxxx/drop // photos/name/image/xxxxx // photos/name/image/xxxxx/edit + // photos/name/image/xxxxx/drop if (Config::get('system', 'block_public') && !local_user() && !remote_user()) { notice(L10n::t('Public access denied.') . EOL); @@ -936,7 +898,8 @@ function photos_content(App $a) $contact = null; $remote_contact = false; $contact_id = 0; - $edit = false; + $edit = ''; + $drop = ''; $owner_uid = $a->data['user']['uid']; @@ -1121,6 +1084,24 @@ function photos_content(App $a) $pager->getItemsPerPage() ); + if ($cmd === 'drop') { + $drop_url = $a->query_string; + + $extra_inputs = [ + ['name' => 'albumname', 'value' => $_POST['albumname']], + ]; + + return Renderer::replaceMacros(Renderer::getMarkupTemplate('confirm.tpl'), [ + '$method' => 'post', + '$message' => L10n::t('Do you really want to delete this photo album and all its photos?'), + '$extra_inputs' => $extra_inputs, + '$confirm' => L10n::t('Delete Album'), + '$confirm_url' => $drop_url, + '$confirm_name' => 'dropalbum', + '$cancel' => L10n::t('Cancel'), + ]); + } + // edit album name if ($cmd === 'edit') { if (($album !== L10n::t('Profile Photos')) && ($album !== 'Contact Photos') && ($album !== L10n::t('Contact Photos'))) { @@ -1142,6 +1123,7 @@ function photos_content(App $a) } else { if (($album !== L10n::t('Profile Photos')) && ($album !== 'Contact Photos') && ($album !== L10n::t('Contact Photos')) && $can_post) { $edit = [L10n::t('Edit Album'), 'photos/' . $a->data['user']['nickname'] . '/album/' . bin2hex($album) . '/edit']; + $drop = [L10n::t('Drop Album'), 'photos/' . $a->data['user']['nickname'] . '/album/' . bin2hex($album) . '/drop']; } } @@ -1187,6 +1169,7 @@ function photos_content(App $a) '$upload' => [L10n::t('Upload New Photos'), 'photos/' . $a->data['user']['nickname'] . '/upload/' . bin2hex($album)], '$order' => $order, '$edit' => $edit, + '$drop' => $drop, '$paginate' => $pager->renderFull($total), ]); @@ -1217,6 +1200,20 @@ function photos_content(App $a) return; } + if ($cmd === 'drop') { + $drop_url = $a->query_string; + + return Renderer::replaceMacros(Renderer::getMarkupTemplate('confirm.tpl'), [ + '$method' => 'post', + '$message' => L10n::t('Do you really want to delete this photo?'), + '$extra_inputs' => [], + '$confirm' => L10n::t('Delete Photo'), + '$confirm_url' => $drop_url, + '$confirm_name' => 'delete', + '$cancel' => L10n::t('Cancel'), + ]); + } + $prevlink = ''; $nextlink = ''; @@ -1225,7 +1222,7 @@ function photos_content(App $a) * The query leads to a really intense used index. * By now we hide it if someone wants to. */ - if (!Config::get('system', 'no_count', false)) { + if ($cmd === 'view' && !Config::get('system', 'no_count', false)) { $order_field = defaults($_GET, 'order', ''); if ($order_field === 'posted') { @@ -1256,12 +1253,26 @@ function photos_content(App $a) break; } } - $edit_suffix = ((($cmd === 'edit') && $can_post) ? '/edit' : ''); + if (!is_null($prv)) { - $prevlink = 'photos/' . $a->data['user']['nickname'] . '/image/' . $prvnxt[$prv]['resource-id'] . $edit_suffix . ($order_field === 'posted' ? '?f=&order=posted' : ''); + $prevlink = 'photos/' . $a->data['user']['nickname'] . '/image/' . $prvnxt[$prv]['resource-id'] . ($order_field === 'posted' ? '?f=&order=posted' : ''); } if (!is_null($nxt)) { - $nextlink = 'photos/' . $a->data['user']['nickname'] . '/image/' . $prvnxt[$nxt]['resource-id'] . $edit_suffix . ($order_field === 'posted' ? '?f=&order=posted' : ''); + $nextlink = 'photos/' . $a->data['user']['nickname'] . '/image/' . $prvnxt[$nxt]['resource-id'] . ($order_field === 'posted' ? '?f=&order=posted' : ''); + } + + $tpl = Renderer::getMarkupTemplate('photo_edit_head.tpl'); + $a->page['htmlhead'] .= Renderer::replaceMacros($tpl,[ + '$prevlink' => $prevlink, + '$nextlink' => $nextlink + ]); + + if ($prevlink) { + $prevlink = [$prevlink, '']; + } + + if ($nextlink) { + $nextlink = [$nextlink, '']; } } } @@ -1283,33 +1294,23 @@ function photos_content(App $a) $album_link = 'photos/' . $a->data['user']['nickname'] . '/album/' . bin2hex($ph[0]['album']); $tools = null; - $lock = null; if ($can_post && ($ph[0]['uid'] == $owner_uid)) { - $tools = [ - 'edit' => ['photos/' . $a->data['user']['nickname'] . '/image/' . $datum . (($cmd === 'edit') ? '' : '/edit'), (($cmd === 'edit') ? L10n::t('View photo') : L10n::t('Edit photo'))], - 'profile'=>['profile_photo/use/'.$ph[0]['resource-id'], L10n::t('Use as profile photo')], - ]; + $tools = []; + if ($cmd === 'edit') { + $tools['view'] = ['photos/' . $a->data['user']['nickname'] . '/image/' . $datum, L10n::t('View photo')]; + } else { + $tools['edit'] = ['photos/' . $a->data['user']['nickname'] . '/image/' . $datum . '/edit', L10n::t('Edit photo')]; + $tools['delete'] = ['photos/' . $a->data['user']['nickname'] . '/image/' . $datum . '/drop', L10n::t('Delete photo')]; + $tools['profile'] = ['profile_photo/use/'.$ph[0]['resource-id'], L10n::t('Use as profile photo')]; + } - // lock - $lock = ((($ph[0]['uid'] == local_user()) && (strlen($ph[0]['allow_cid']) || strlen($ph[0]['allow_gid']) - || strlen($ph[0]['deny_cid']) || strlen($ph[0]['deny_gid']))) - ? L10n::t('Private Message') - : Null); - - - } - - if ($cmd === 'edit') { - $tpl = Renderer::getMarkupTemplate('photo_edit_head.tpl'); - $a->page['htmlhead'] .= Renderer::replaceMacros($tpl,[ - '$prevlink' => $prevlink, - '$nextlink' => $nextlink - ]); - } - - if ($prevlink) { - $prevlink = [$prevlink, '']; + if ( + $ph[0]['uid'] == local_user() + && (strlen($ph[0]['allow_cid']) || strlen($ph[0]['allow_gid']) || strlen($ph[0]['deny_cid']) || strlen($ph[0]['deny_gid'])) + ) { + $tools['lock'] = L10n::t('Private Photo'); + } } $photo = [ @@ -1322,9 +1323,7 @@ function photos_content(App $a) 'filename' => $hires['filename'], ]; - if ($nextlink) { - $nextlink = [$nextlink, '']; - } + // Do we have an item for this photo? @@ -1431,7 +1430,7 @@ function photos_content(App $a) $tpl = Renderer::getMarkupTemplate('photo_item.tpl'); $return_path = $a->cmd; - if ($can_post || Security::canWriteToUserWall($owner_uid)) { + if ($cmd === 'view' && ($can_post || Security::canWriteToUserWall($owner_uid))) { $like_tpl = Renderer::getMarkupTemplate('like_noshare.tpl'); $likebuttons = Renderer::replaceMacros($like_tpl, [ '$id' => $link_item['id'], @@ -1510,7 +1509,7 @@ function photos_content(App $a) continue; } - $profile_url = Contact::MagicLinkById($item['author-id']); + $profile_url = Contact::magicLinkbyId($item['author-id']); if (strpos($profile_url, 'redir/') === 0) { $sparkle = ' sparkle'; } else { @@ -1574,7 +1573,6 @@ function photos_content(App $a) '$id' => $ph[0]['id'], '$album' => [$album_link, $ph[0]['album']], '$tools' => $tools, - '$lock' => $lock, '$photo' => $photo, '$prevlink' => $prevlink, '$nextlink' => $nextlink, diff --git a/view/templates/album_edit.tpl b/view/templates/album_edit.tpl index 72aedd8b7..b6f24ec3b 100644 --- a/view/templates/album_edit.tpl +++ b/view/templates/album_edit.tpl @@ -9,7 +9,6 @@
- diff --git a/view/templates/photo_album.tpl b/view/templates/photo_album.tpl index cae3b868a..5080663ab 100644 --- a/view/templates/photo_album.tpl +++ b/view/templates/photo_album.tpl @@ -3,6 +3,12 @@ {{if $edit}} {{/if}} +{{if $edit}} + +{{/if}} +{{if $drop}} + +{{/if}} {{if $can_post}} diff --git a/view/templates/photo_edit.tpl b/view/templates/photo_edit.tpl index 8b22dfb44..49a550e42 100644 --- a/view/templates/photo_edit.tpl +++ b/view/templates/photo_edit.tpl @@ -1,6 +1,5 @@ - -
+ @@ -28,9 +27,6 @@
-
- - diff --git a/view/templates/photo_view.tpl b/view/templates/photo_view.tpl index 372bcb536..7170ceb33 100644 --- a/view/templates/photo_view.tpl +++ b/view/templates/photo_view.tpl @@ -4,11 +4,22 @@ {{if $prevlink}}{{/if}} diff --git a/view/theme/frio/js/mod_photos.js b/view/theme/frio/js/mod_photos.js index 77173385b..2e7160aaf 100644 --- a/view/theme/frio/js/mod_photos.js +++ b/view/theme/frio/js/mod_photos.js @@ -23,6 +23,15 @@ $(document).ready(function() { addToModal(modalUrl, 'photo-album-edit-wrapper'); } }); + + // Click event listener for the album drop link/button. + $("body").on('click', '#album-drop-link', function() { + var modalUrl = $(this).attr("data-modal-url"); + + if (typeof modalUrl !== "undefined") { + addToModal(modalUrl); + } + }); }); $(window).load(function() { diff --git a/view/theme/frio/templates/album_edit.tpl b/view/theme/frio/templates/album_edit.tpl index 0b58d520d..4f240922a 100644 --- a/view/theme/frio/templates/album_edit.tpl +++ b/view/theme/frio/templates/album_edit.tpl @@ -7,7 +7,6 @@
-
diff --git a/view/theme/frio/templates/confirm.tpl b/view/theme/frio/templates/confirm.tpl index 62611593c..36072a56b 100644 --- a/view/theme/frio/templates/confirm.tpl +++ b/view/theme/frio/templates/confirm.tpl @@ -1,6 +1,5 @@ -
- +
{{$message}}
{{foreach $extra_inputs as $input}} @@ -10,5 +9,4 @@ -
diff --git a/view/theme/frio/templates/photo_album.tpl b/view/theme/frio/templates/photo_album.tpl index a34e8ea86..a3b030477 100644 --- a/view/theme/frio/templates/photo_album.tpl +++ b/view/theme/frio/templates/photo_album.tpl @@ -16,6 +16,12 @@ {{/if}} + {{if $drop}} + + + {{/if}} {{if ! $noorder}} diff --git a/view/theme/frio/templates/photo_view.tpl b/view/theme/frio/templates/photo_view.tpl index 359c42669..82bddcfc6 100644 --- a/view/theme/frio/templates/photo_view.tpl +++ b/view/theme/frio/templates/photo_view.tpl @@ -10,22 +10,38 @@
@@ -80,10 +96,12 @@
+{{if !$edit}} {{* Insert the comments *}}
{{$comments nofilter}}
{{$paginate nofilter}} +{{/if}} diff --git a/view/theme/quattro/templates/photo_view.tpl b/view/theme/quattro/templates/photo_view.tpl index a4787270f..1ce336b0a 100644 --- a/view/theme/quattro/templates/photo_view.tpl +++ b/view/theme/quattro/templates/photo_view.tpl @@ -3,11 +3,22 @@
diff --git a/view/theme/vier/templates/photo_view.tpl b/view/theme/vier/templates/photo_view.tpl index 617bcc5b2..f70ec5b56 100644 --- a/view/theme/vier/templates/photo_view.tpl +++ b/view/theme/vier/templates/photo_view.tpl @@ -4,11 +4,22 @@ {{if $prevlink}}{{/if}}