diff --git a/admin/themes/default/js/album_selector.js b/admin/themes/default/js/album_selector.js
index 9cc0b319d..16cf5d308 100644
--- a/admin/themes/default/js/album_selector.js
+++ b/admin/themes/default/js/album_selector.js
@@ -32,8 +32,7 @@ function linked_albums_search(searchText) {
}
}
- console.log('lalalal');
- console.log(api_method);
+ // console.log(api_method);
$(".linkedAlbumPopInContainer .searching").show();
$.ajax({
@@ -66,3 +65,70 @@ function linked_albums_search(searchText) {
}
})
}
+
+function prefill_search() {
+ $(".linkedAlbumPopInContainer .searching").show();
+ if (api_method == "pwg.categories.getList") {
+ api_params = {
+ cat_id: 0,
+ recursive: false,
+ fullname: true,
+ limit: limit_params,
+ };
+ } else {
+ api_params = {
+ additional_output: "full_name_with_admin_links",
+ };
+ }
+
+ $.ajax({
+ url: "ws.php?format=json&method=" + api_method,
+ type: "POST",
+ dataType: "json",
+ data: api_params,
+ success: function (data) {
+ // for debug
+ // console.log(data);
+ $(".linkedAlbumPopInContainer .searching").hide();
+ const cats = data.result.categories;
+ const limit = data.result.limit;
+ prefill_results("root", cats, limit);
+ },
+ error: function (e) {
+ $(".linkedAlbumPopInContainer .searching").hide();
+ console.log("error : ", e.message);
+ },
+ });
+}
+
+async function prefill_search_subcats(cat_id) {
+ let method = {};
+ if (api_method == "pwg.categories.getList") {
+ method = {
+ cat_id: cat_id,
+ recursive: false,
+ limit: limit_params,
+ };
+ } else {
+ method = {
+ additional_output: "full_name_with_admin_links",
+ };
+ }
+
+ try {
+ const data = await $.ajax({
+ url: "ws.php?format=json&method=" + api_method,
+ type: "POST",
+ dataType: "json",
+ data: method,
+ });
+
+ // for debug
+ // console.log(data);
+ const cats = data.result.categories.filter((c) => c.id !== +cat_id);
+ const limit = data.result.limit;
+ prefill_results(cat_id, cats, limit);
+ } catch (e) {
+ console.log("error", e.message);
+ }
+}
\ No newline at end of file
diff --git a/admin/themes/default/template/include/album_selector.inc.tpl b/admin/themes/default/template/include/album_selector.inc.tpl
index c258f16b7..0d9dc020a 100644
--- a/admin/themes/default/template/include/album_selector.inc.tpl
+++ b/admin/themes/default/template/include/album_selector.inc.tpl
@@ -2,7 +2,8 @@
{if !isset($show_root_btn)}{$show_root_btn=false}{/if}
{include file='include/colorbox.inc.tpl' load_mode=$load_mode}
-{combine_script id='albumSelector' load_mode=$load_mode path='admin/themes/default/js/album_selector.js'}
+{combine_script id='albumSelector' load=$load_mode path='admin/themes/default/js/album_selector.js'}
+{combine_script id='common' load='footer' path='admin/themes/default/js/common.js'}
{footer_script}
str_no_search_in_progress = '{'No search in progress'|@translate|escape:javascript}';
str_albums_found = '{"%d albums found"|translate}';
@@ -14,6 +15,9 @@
api_method = 'pwg.categories.getAdminList';
{/if}
+ const limit_params = 50;
+ const str_plus_albums_found = "{'Only the first %d albums are displayed, out of %d.'|@translate|escape:javascript}"
+ const str_album_selected = "{'Album already selected'|@translate|escape:javascript}"
{/footer_script}
diff --git a/include/ws_functions/pwg.categories.php b/include/ws_functions/pwg.categories.php
index 4d9907690..ea8f7f395 100644
--- a/include/ws_functions/pwg.categories.php
+++ b/include/ws_functions/pwg.categories.php
@@ -246,6 +246,12 @@ function ws_categories_getList($params, &$service)
return new PwgError(WS_ERR_INVALID_PARAM, "Invalid thumbnail_size");
}
+ if (!empty($params['limit']) and $params['recursive'])
+ {
+ return new PwgError(WS_ERR_INVALID_PARAM, 'Cannot use both recursive and limit parameters at the same time');
+ }
+
+ $output = [];
$where = array('1=1');
$join_type = 'INNER';
$join_user = $user['id'];
@@ -290,7 +296,7 @@ function ws_categories_getList($params, &$service)
}
$query = '
-SELECT
+SELECT SQL_CALC_FOUND_ROWS
id, name, comment, permalink, status,
uppercats, global_rank, id_uppercat,
nb_images, count_images AS total_nb_images,
@@ -302,17 +308,41 @@ SELECT
ON id=cat_id AND user_id='.$join_user.'
WHERE '. implode("\n AND ", $where);
- if (isset($params["search"]) and $params['search'] != "")
+ if (isset($params['search']) and '' != $params['search'])
{
$query .= '
- AND name LIKE \'%'.pwg_db_real_escape_string($params["search"]).'%\'
- LIMIT '.$conf["linked_album_search_limit"];
+ AND name LIKE \'%'.pwg_db_real_escape_string($params['search']).'%\'';
+ if (!isset($params['limit']))
+ {
+ $query .= ' LIMIT '.$conf["linked_album_search_limit"];
+ }
+ }
+
+ if (isset($params['limit']))
+ {
+ $query .= '
+ ORDER BY rank ASC
+ LIMIT '.($params['limit'] + ($params['cat_id'] > 0 ? 1 : 0));
}
$query.= '
;';
$result = pwg_query($query);
+ if (isset($params['limit']))
+ {
+ list($result_count) = pwg_db_fetch_row(pwg_query('SELECT FOUND_ROWS()'));
+ if ($params['cat_id'] > 0)
+ {
+ $result_count = $result_count - 1;
+ }
+ $output['limit'] = array(
+ 'limited_to' => $params['limit'],
+ 'total_cats' => intval($result_count),
+ 'remaining_cats' => $result_count > $params['limit'] ? $result_count - $params['limit'] : 0,
+ );
+ }
+
// management of the album thumbnail -- starts here
$image_ids = array();
$categories = array();
@@ -542,13 +572,13 @@ SELECT id, path, representative_ext
return categories_flatlist_to_tree($cats);
}
- return array(
- 'categories' => new PwgNamedArray(
- $cats,
- 'category',
- ws_std_get_category_xml_attributes()
- )
- );
+ $output['categories'] = new PwgNamedArray(
+ $cats,
+ 'category',
+ ws_std_get_category_xml_attributes()
+ );
+
+ return $output;
}
/**
diff --git a/language/en_UK/common.lang.php b/language/en_UK/common.lang.php
index e4958b449..bc3924b83 100644
--- a/language/en_UK/common.lang.php
+++ b/language/en_UK/common.lang.php
@@ -444,4 +444,6 @@ $lang['rating score %s'] = 'rating score %s';
$lang['year %d'] = 'year %d';
$lang['last 3 months'] = 'Last 3 months';
$lang['last 24 hours'] = 'last 24 hours';
+$lang['Album already selected'] = 'Album already selected';
+$lang['Only the first %d albums are displayed, out of %d.'] = 'Only the first %d albums are displayed, out of %d.';
?>
diff --git a/language/fr_FR/common.lang.php b/language/fr_FR/common.lang.php
index 2f9b41be3..fbf55b16b 100644
--- a/language/fr_FR/common.lang.php
+++ b/language/fr_FR/common.lang.php
@@ -449,4 +449,5 @@ $lang['rating score %s'] = 'score %s';
$lang['year %d'] = 'année %d';
$lang['last 3 months'] = '3 derniers mois';
$lang['last 24 hours'] = '24 dernières heures';
-
+$lang['Only the first %d albums are displayed, out of %d.'] = 'Seuls les %d premiers sont affichés, sur %d.';
+$lang['Album already selected'] = 'Album déjà sélectionné';
diff --git a/themes/default/css/clear-search.css b/themes/default/css/clear-search.css
index 3b8560880..c29b0c56f 100644
--- a/themes/default/css/clear-search.css
+++ b/themes/default/css/clear-search.css
@@ -271,6 +271,10 @@
color:#000;
}
+.and-more{
+ color: #777
+}
+
@media (max-width: 600px) {
.filter-form {
width: 101vw;
diff --git a/themes/default/css/dark-search.css b/themes/default/css/dark-search.css
index a76ac34ba..1019cc267 100644
--- a/themes/default/css/dark-search.css
+++ b/themes/default/css/dark-search.css
@@ -274,6 +274,10 @@
color:black;
}
+.and-more{
+ color: #777
+}
+
@media (max-width: 600px) {
.filter-form {
width: 100vw;
diff --git a/themes/default/css/search.css b/themes/default/css/search.css
index ae7816109..3880aae16 100644
--- a/themes/default/css/search.css
+++ b/themes/default/css/search.css
@@ -724,6 +724,40 @@
margin-bottom:10px;
}
+.display-subcat {
+ margin-right: 2px;
+}
+
+.display-subcat:hover {
+ cursor: pointer;
+}
+
+.display-subcat::before {
+ transition: 0.5s;
+ transform: rotate(90deg);
+}
+
+.display-subcat.open::before {
+ transform: rotate(180deg);
+}
+
+.prefill-results-item {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: center;
+}
+
+.search-result-subcat-item {
+ display: none;
+}
+
+.search-result-item.already-in {
+ cursor: default;
+}
+.and-more{
+ text-align: center;
+}
@media (max-width: 600px) {
html, body {
diff --git a/themes/default/js/mcs.js b/themes/default/js/mcs.js
index e434b8c09..91d7990a5 100644
--- a/themes/default/js/mcs.js
+++ b/themes/default/js/mcs.js
@@ -2,7 +2,8 @@ $(document).ready(function () {
related_categories_ids = [];
$(".linkedAlbumPopInContainer .ClosePopIn").addClass(prefix_icon + "cancel");
- $(".linkedAlbumPopInContainer .searching").hide();
+ $(".linkedAlbumPopInContainer .searching").addClass(prefix_icon + "spin6").hide();
+ $(".AddIconContainer").css('display', 'none');
$(".filter-validate").on("click", function () {
$(this).find(".loading").css("display", "block");
$(this).find(".validate-text").hide();
@@ -543,23 +544,35 @@ $(document).ready(function () {
});
$(".add-album-button").on("click", function () {
+ $("#linkedAlbumSearch .search-cancel-linked-album").hide();
+ prefill_search();
linked_albums_open();
set_up_popin();
});
$("#linkedAlbumSearch .search-input").on('input', function () {
+ const clear_button = $("#linkedAlbumSearch .search-cancel-linked-album");
if ($(this).val() != 0) {
- $("#linkedAlbumSearch .search-cancel-linked-album").show();
+ clear_button.show();
+ clear_button.on('click', function () {
+ $("#linkedAlbumSearch .search-input").val('');
+ $(".limitReached").html(str_no_search_in_progress);
+ $("#searchResult").empty();
+ prefill_search();
+ $(this).hide();
+ });
} else {
- $("#linkedAlbumSearch .search-cancel-linked-album").hide();
+ clear_button.hide();
}
// Search input value length required to start searching
if ($(this).val().length > 0) {
+ $("#searchResult").empty();
linked_albums_search($(this).val());
} else {
$(".limitReached").html(str_no_search_in_progress);
$("#searchResult").empty();
+ prefill_search();
}
})
@@ -753,6 +766,91 @@ function fill_results(cats) {
});
}
+function prefill_results(rank, cats, limit) {
+ // get where appends data
+ let display_div = '';
+ if ('root' == rank){
+ $("#searchResult").empty();
+ display_div = '#searchResult';
+ } else {
+ display_div = '#subcat-'+rank;
+ }
+
+ cats.forEach(cat => {
+ let subcat = '';
+ if (cat.nb_categories > 0) {
+ subcat = "
"
+ }
+
+ if (!related_categories_ids.includes(cat.id)) {
+ $(display_div).append(
+ "
" +
+ subcat +
+ "
" +
+ "" + cat.name +"" +
+ "" +
+ "
" +
+ "
"
+ );
+ } else {
+ $(display_div).append(
+ "
" +
+ subcat +
+ "
" +
+ "" + cat.name +"" +
+ "" +
+ "
" +
+ "
"
+ );
+ }
+
+ if (rank !== 'root') {
+ const item = $("#"+rank+".search-result-item");
+ const margin_left = parseInt(item.css('margin-left')) + 25;
+ $("#"+cat.id+".search-result-item").css('margin-left', margin_left);
+ }
+
+ $("#"+cat.id+".prefill-results-item.available").on("click", function () {
+ add_related_category(cat.id, cat.name);
+ });
+
+ $("#"+cat.id+".display-subcat").on('click', function () {
+ const cat_id = $(this).prop('id');
+
+ if($(this).hasClass('open')){
+ // CLOSING SUBCAT
+ $(this).removeClass('open');
+ $("#subcat-"+cat.id).fadeOut();
+
+ } else {
+ // OPENING SUBCAT
+ // if subcat div exist
+ if ($("#subcat-"+cat.id).length){
+ $(this).addClass('open');
+ $("#subcat-"+cat.id).fadeIn();
+ } else { // if subcat div doesn't exist
+ $("#"+cat_id+".display-subcat").removeClass('gallery-icon-up-open').addClass('gallery-icon-spin6 animate-spin');
+ $("#"+cat_id+".search-result-item").after(`
`);
+ prefill_search_subcats(cat_id).then(() => {
+ $("#"+cat_id+".display-subcat").removeClass('gallery-icon-spin6 animate-spin').addClass('gallery-icon-up-open');
+ $(this).addClass('open');
+ $("#subcat-"+cat.id).fadeIn();
+ });
+ }
+ }
+
+ });
+ });
+ // for debug
+ // console.log(limit);
+ if (limit.remaining_cats > 0) {
+ const text = sprintf(str_plus_albums_found, limit.limited_to, limit.total_cats);
+ $(display_div).append(
+ "
" + text + "
"
+ );
+ }
+}
+
function add_related_category(cat_id, cat_link_path) {
$(".selected-categories-container").append(
"
" +
diff --git a/ws.php b/ws.php
index 398aea2d4..83d86f80b 100644
--- a/ws.php
+++ b/ws.php
@@ -158,6 +158,10 @@ function ws_addDefaultMethods( $arr )
'info' => implode(',', array_keys(ImageStdParams::get_defined_type_map()))
),
'search' => array('default' => null),
+ 'limit' => array(
+ 'default' => null,
+ 'type'=>WS_TYPE_INT|WS_TYPE_POSITIVE,
+ 'info' => 'Parameter not compatible with recursive=true'),
),
'Returns a list of categories.',
$ws_functions_root . 'pwg.categories.php'