fixes #1381 orphans calculation is done only when needed by ajax call

This commit is contained in:
Matthieu Leproux 2021-07-28 16:52:44 +02:00
parent b9394d967c
commit ddbdbd93bb
4 changed files with 176 additions and 80 deletions

View file

@ -189,68 +189,6 @@ $subcat_ids = get_subcat_ids(array($category['id']));
$category['nb_subcats'] = count($subcat_ids) - 1;
// total number of images under this category (including sub-categories)
$query = '
SELECT
DISTINCT(image_id)
FROM '.IMAGE_CATEGORY_TABLE.'
WHERE category_id IN ('.implode(',', $subcat_ids).')
;';
$image_ids_recursive = query2array($query, null, 'image_id');
$category['nb_images_recursive'] = count($image_ids_recursive);
// number of images that would become orphan on album deletion
$category['nb_images_becoming_orphan'] = 0;
$category['nb_images_associated_outside'] = 0;
if ($category['nb_images_recursive'] > 0)
{
// if we don't have "too many" photos, it's faster to compute the orphans with MySQL
if ($category['nb_images_recursive'] < 1000)
{
$query = '
SELECT
DISTINCT(image_id)
FROM '.IMAGE_CATEGORY_TABLE.'
WHERE category_id NOT IN ('.implode(',', $subcat_ids).')
AND image_id IN ('.implode(',', $image_ids_recursive).')
;';
$image_ids_associated_outside = query2array($query, null, 'image_id');
$category['nb_images_associated_outside'] = count($image_ids_associated_outside);
$image_ids_becoming_orphan = array_diff($image_ids_recursive, $image_ids_associated_outside);
$category['nb_images_becoming_orphan'] = count($image_ids_becoming_orphan);
}
// else it's better to avoid sending a huge SQL request, we compute the orphan list with PHP
else
{
$image_ids_recursive_keys = array_flip($image_ids_recursive);
$query = '
SELECT
image_id
FROM '.IMAGE_CATEGORY_TABLE.'
WHERE category_id NOT IN ('.implode(',', $subcat_ids).')
;';
$image_ids_associated_outside = query2array($query, null, 'image_id');
$image_ids_not_orphan = array();
foreach ($image_ids_associated_outside as $image_id)
{
if (isset($image_ids_recursive_keys[$image_id]))
{
$image_ids_not_orphan[] = $image_id;
}
}
$category['nb_images_associated_outside'] = count(array_unique($image_ids_not_orphan));
$image_ids_becoming_orphan = array_diff($image_ids_recursive, $image_ids_not_orphan);
$category['nb_images_becoming_orphan'] = count($image_ids_becoming_orphan);
}
}
// Navigation path
$navigation = get_cat_display_name_cache(
$category['uppercats'],
@ -391,9 +329,9 @@ $template->assign(
array(
'CATEGORY_FULLNAME' => trim(strip_tags($navigation)),
'NB_SUBCATS' => $category['nb_subcats'],
'NB_IMAGES_RECURSIVE' => $category['nb_images_recursive'],
'NB_IMAGES_BECOMING_ORPHAN' => $category['nb_images_becoming_orphan'],
'NB_IMAGES_ASSOCIATED_OUTSIDE' => $category['nb_images_associated_outside'],
// 'NB_IMAGES_RECURSIVE' => $category['nb_images_recursive'],
// 'NB_IMAGES_BECOMING_ORPHAN' => $category['nb_images_becoming_orphan'],
// 'NB_IMAGES_ASSOCIATED_OUTSIDE' => $category['nb_images_associated_outside'],
)
);

View file

@ -1,11 +1,17 @@
{combine_script id='common' load='footer' path='admin/themes/default/js/common.js'}
{include file='include/colorbox.inc.tpl'}
{combine_script id='LocalStorageCache' load='footer' path='admin/themes/default/js/LocalStorageCache.js'}
{combine_script id='jquery.confirm' load='footer' require='jquery' path='themes/default/js/plugins/jquery-confirm.min.js'}
{* {combine_script id='cat_modify' load='footer' path='admin/themes/default/js/cat_modify.js'} *}
{combine_script id='jquery.selectize' load='footer' path='themes/default/js/plugins/selectize.min.js'}
{combine_css id='jquery.selectize' path="themes/default/js/plugins/selectize.{$themeconf.colorscheme}.css"}
{footer_script}
const has_images_associated_outside = '{"delete album and all %d photos, even the %d associated to other albums"|@translate|escape:javascript}';
const has_images_becomming_orphans = '{'delete album and the %d orphan photos'|@translate|escape:javascript}';
const has_images_recursives = '{'delete only album, not photos'|@translate|escape:javascript}';
{* <!-- CATEGORIES --> *}
var categoriesCache = new CategoriesCache({
serverKey: '{$CACHE_KEYS.categories}',
@ -98,6 +104,40 @@ jQuery(document).ready(function() {
e.preventDefault();
});
$(".deleteAlbum").on("click", function() {
$.ajax({
url: "ws.php?format=json&method=pwg.images.calculateOrphansOnAlbumDeletion",
type: "GET",
data: {
category_id: {$CAT_ID},
},
success: function (raw_data) {
let data = JSON.parse(raw_data).result[0]
console.log(data);
if (data.nb_images_recursive == 0) {
$(".delete_popin ul").hide();
} else {
if (data.nb_images_associated_outside == 0) {
$("#IMAGES_ASSOCIATED_OUTSIDE").hide();
} else {
$("#IMAGES_ASSOCIATED_OUTSIDE .innerText").html("");
$("#IMAGES_ASSOCIATED_OUTSIDE .innerText").append(has_images_associated_outside.replace('%d', data.nb_images_recursive).replace('%d', data.nb_images_associated_outside));
}
if (data.nb_images_becoming_orphan == 0) {
$("#IMAGES_BECOMING_ORPHAN").hide();
} else {
$("#IMAGES_BECOMING_ORPHAN .innerText").html("");
$("#IMAGES_BECOMING_ORPHAN .innerText").append(has_images_becomming_orphans.replace('%d', data.nb_images_becoming_orphan));
}
}
},
error: function(message) {
console.log(message);
}
});
});
jQuery(".deleteAlbum").click(function() {
jQuery.colorbox({
inline:true,
@ -186,6 +226,10 @@ function cropImage() {
.delete_popin p.popin-actions {
margin-top:30px;
}
#cboxContent {
background: none;
}
{/html_style}
@ -354,25 +398,15 @@ function cropImage() {
{'Delete album "%s" and its %d sub-albums.'|translate:$CATEGORIES_NAV:$NB_SUBCATS}
{/if}
</p>
{if $NB_IMAGES_RECURSIVE > 0}
<ul>
{if $NB_IMAGES_ASSOCIATED_OUTSIDE > 0}
<li><label class="font-checkbox"><span class="icon-dot-circled"></span><input type="radio" name="photo_deletion_mode" value="force_delete"> {'delete album and all %d photos, even the %d associated to other albums'|translate:$NB_IMAGES_RECURSIVE:$NB_IMAGES_ASSOCIATED_OUTSIDE}</label></li>
{/if}
{if $NB_IMAGES_BECOMING_ORPHAN > 0}
<li><label class="font-checkbox"><span class="icon-dot-circled"></span><input type="radio" name="photo_deletion_mode" value="delete_orphans"> {'delete album and the %d orphan photos'|translate:$NB_IMAGES_BECOMING_ORPHAN}</label></li>
{/if}
<li><label class="font-checkbox"><span class="icon-dot-circled"></span><input type="radio" name="photo_deletion_mode" value="no_delete" checked="checked"> {'delete only album, not photos'|translate}</label></li>
</ul>
{/if}
<ul>
<li id="IMAGES_ASSOCIATED_OUTSIDE"><label class="font-checkbox"><span class="icon-dot-circled"></span><input type="radio" name="photo_deletion_mode" value="force_delete"><span class="innerText"></span></label></li>
<li id="IMAGES_BECOMING_ORPHAN"><label class="font-checkbox"><span class="icon-dot-circled"></span><input type="radio" name="photo_deletion_mode" value="delete_orphans"><span class="innerText"></span></label></li>
<li id="IMAGES_RECURSIVE"><label class="font-checkbox"><span class="icon-dot-circled"></span><input type="radio" name="photo_deletion_mode" value="no_delete" checked="checked">{'delete only album, not photos'|translate}</label></li>
</ul>
<p class="popin-actions">
<a id="deleteConfirm" class="buttonLike" type="submit" href="{$U_DELETE}"><i class="icon-trash"></i> {'Confirm deletion'|translate}</button>
<a class="icon-cancel-circled close-delete_popin" href="#">{'Cancel'|translate}</a>
</p>
{* $U_DELETE *}
</div>
</div>

View file

@ -555,4 +555,116 @@ SELECT
fclose($f);
}
/**
* API method
* Return the number of orphan photos if an album is deleted
*/
function ws_images_calculateOrphansOnAlbumDeletion($param, &$service)
{
global $conf;
$category_id = $param['category_id'][0];
$query = '
SELECT DISTINCT
category_id
FROM
'.IMAGE_CATEGORY_TABLE.'
WHERE
category_id = '.$category_id.'
LIMIT 1';
$result = pwg_query($query);
$category['has_images'] = pwg_db_num_rows($result)>0 ? true : false;
// number of sub-categories
$subcat_ids = get_subcat_ids(array($category_id));
$category['nb_subcats'] = count($subcat_ids) - 1;
// total number of images under this category (including sub-categories)
$query = '
SELECT DISTINCT
(image_id)
FROM
'.IMAGE_CATEGORY_TABLE.'
WHERE
category_id IN ('.implode(',', $subcat_ids).')
;';
$image_ids_recursive = query2array($query, null, 'image_id');
$category['nb_images_recursive'] = count($image_ids_recursive);
// number of images that would become orphan on album deletion
$category['nb_images_becoming_orphan'] = 0;
$category['nb_images_associated_outside'] = 0;
if ($category['nb_images_recursive'] > 0)
{
// if we don't have "too many" photos, it's faster to compute the orphans with MySQL
if ($category['nb_images_recursive'] < 1000)
{
$query = '
SELECT DISTINCT
(image_id)
FROM
'.IMAGE_CATEGORY_TABLE.'
WHERE
category_id
NOT IN
('.implode(',', $subcat_ids).')
AND
image_id
IN
('.implode(',', $image_ids_recursive).')
;';
$image_ids_associated_outside = query2array($query, null, 'image_id');
$category['nb_images_associated_outside'] = count($image_ids_associated_outside);
$image_ids_becoming_orphan = array_diff($image_ids_recursive, $image_ids_associated_outside);
$category['nb_images_becoming_orphan'] = count($image_ids_becoming_orphan);
}
// else it's better to avoid sending a huge SQL request, we compute the orphan list with PHP
else
{
$image_ids_recursive_keys = array_flip($image_ids_recursive);
$query = '
SELECT
image_id
FROM
'.IMAGE_CATEGORY_TABLE.'
WHERE
category_id
NOT IN
('.implode(',', $subcat_ids).')
;';
$image_ids_associated_outside = query2array($query, null, 'image_id');
$image_ids_not_orphan = array();
foreach ($image_ids_associated_outside as $image_id)
{
if (isset($image_ids_recursive_keys[$image_id]))
{
$image_ids_not_orphan[] = $image_id;
}
}
$category['nb_images_associated_outside'] = count(array_unique($image_ids_not_orphan));
$image_ids_becoming_orphan = array_diff($image_ids_recursive, $image_ids_not_orphan);
$category['nb_images_becoming_orphan'] = count($image_ids_becoming_orphan);
}
}
$output[] = array(
'nb_images_associated_outside' => $category['nb_images_associated_outside'],
'nb_images_becoming_orphan' => $category['nb_images_becoming_orphan'],
'nb_images_recursive' => $category['nb_images_recursive'],
);
return $output;
}
?>

12
ws.php
View file

@ -593,6 +593,18 @@ function ws_addDefaultMethods( $arr )
array('admin_only'=>true, 'post_only'=>true)
);
$service->addMethod(
'pwg.images.calculateOrphansOnAlbumDeletion',
'ws_images_calculateOrphansOnAlbumDeletion',
array(
'category_id' => array('type'=>WS_TYPE_ID,
'flags'=>WS_PARAM_FORCE_ARRAY),
),
'Return the number of orphan photos if an album is deleted.',
$ws_functions_root . 'pwg.php',
array('admin_only'=>true)
);
$service->addMethod(
'pwg.categories.getAdminList',
'ws_categories_getAdminList',