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( "