diff --git a/admin/batch_manager_unit.php b/admin/batch_manager_unit.php index 85ae1d60e..d69577d01 100644 --- a/admin/batch_manager_unit.php +++ b/admin/batch_manager_unit.php @@ -514,7 +514,8 @@ SELECT ) )); } - + + $template->assign('ACTIVE_PLUGINS', array_keys($pwg_loaded_plugins)); $template->assign(array( 'ELEMENT_IDS' => implode(',', $element_ids), diff --git a/admin/themes/default/js/batchManagerGlobal.js b/admin/themes/default/js/batchManagerGlobal.js index bc7b88e7b..6b806c676 100644 --- a/admin/themes/default/js/batchManagerGlobal.js +++ b/admin/themes/default/js/batchManagerGlobal.js @@ -1,73 +1,3 @@ - -/* ********** Filters*/ -function filter_enable(filter) { - /* show the filter*/ - $("#"+filter).show(); - - /* check the checkbox to declare we use this filter */ - $("input[type=checkbox][name="+filter+"_use]").prop("checked", true); - - /* forbid to select this filter in the addFilter list */ - $("#addFilter").find("a[data-value="+filter+"]").addClass("disabled", "disabled"); - - /* hide the no filter message */ - $('.noFilter').hide(); - $('.addFilter-button').removeClass('highlight'); -} - -function filter_disable(filter) { - /* hide the filter line */ - $("#"+filter).hide(); - - /* uncheck the checkbox to declare we do not use this filter */ - $("input[name="+filter+"_use]").prop("checked", false); - - /* give the possibility to show it again */ - $("#addFilter").find("a[data-value="+filter+"]").removeClass("disabled"); - - /* show the no filter message if no filter selected */ - if ($('#filterList li:visible').length == 0) { - $('.noFilter').show(); - $('.addFilter-button').addClass('highlight'); - } - -} - -$(".removeFilter").addClass("icon-cancel-circled"); - -$(".removeFilter").click(function () { - var filter = $(this).parent('li').attr("id"); - filter_disable(filter); - - return false; -}); - -$("#addFilter a").on('click', function () { - var filter = $(this).attr("data-value"); - filter_enable(filter); -}); - -$("#removeFilters").click(function() { - $("#filterList li").each(function() { - var filter = $(this).attr("id"); - filter_disable(filter); - }); - return false; -}); - -$('[data-slider=widths]').pwgDoubleSlider(sliders.widths); -$('[data-slider=heights]').pwgDoubleSlider(sliders.heights); -$('[data-slider=ratios]').pwgDoubleSlider(sliders.ratios); -$('[data-slider=filesizes]').pwgDoubleSlider(sliders.filesizes); - - -$(document).mouseup(function (e) { - e.stopPropagation(); - if (!$(event.target).hasClass('addFilter-button')) { - $('.addFilter-dropdown').slideUp(); - } -}); - /* ********** Thumbs */ /* Shift-click: select all photos between the click and the shift+click */ diff --git a/admin/themes/default/js/batchManagerUnit.js b/admin/themes/default/js/batchManagerUnit.js index f9fcf0d5d..2ab2bec7c 100644 --- a/admin/themes/default/js/batchManagerUnit.js +++ b/admin/themes/default/js/batchManagerUnit.js @@ -1,382 +1,330 @@ -$(document).ready(function () { - //Pagination - +$(document).ready(function() { // Detect unsaved changes on any inputs var user_interacted = false; $('input, textarea, select').on('focus', function() { - user_interacted = true; + user_interacted = true; }); - $('input, textarea, select').on('change', function() { - var pictureId = $(this).parents("fieldset").data("image_id"); - if (user_interacted == true) { - showUnsavedLocalBadge(pictureId); - - } + $('input, textarea').on('input', function() { + var pictureId = $(this).parents("fieldset").data("image_id"); + if (user_interacted == true) { + showUnsavedLocalBadge(pictureId); + } + }); + + // Specific handler for datepicker inputs + $('input[data-datepicker]').on('change', function() { + var pictureId = $(this).parents("fieldset").data("image_id"); + if (user_interacted == true) { + showUnsavedLocalBadge(pictureId); + } + }); + + $('select').on('change', function() { + var pictureId = $(this).parents("fieldset").data("image_id"); + if (user_interacted == true) { + showUnsavedLocalBadge(pictureId); + } }); $('.related-categories-container .remove-item, .datepickerDelete').on('click', function() { user_interacted = true; var pictureId = $(this).parents("fieldset").data("image_id"); showUnsavedLocalBadge(pictureId); - + }); -}); - //METADATA SYNC - $('.action-sync-metadata').on('click', function(event){ + // METADATA SYNC + $('.action-sync-metadata').on('click', function(event) { var pictureId = $(this).parents("fieldset").data("image_id"); $.confirm({ - title: str_meta_warning, - draggable: false, - titleClass: "metadataSyncConfirm", - theme: "modern", - content: "", - animation: "zoom", - boxWidth: '30%', - useBootstrap: false, - type: 'red', - animateFromElement: false, - backgroundDismiss: true, - typeAnimated: false, - buttons: { - confirm: { - text: str_meta_yes, - btnClass: 'btn-red', - action: function () { - disableLocalButton(pictureId); - $.ajax({ - type: 'POST', - url: 'ws.php?format=json', - data: { - method: "pwg.images.syncMetadata", - pwg_token: jQuery("input[name=pwg_token]").val(), - image_id: pictureId - }, - dataType: 'json', - success: function(data) { - var isOk = data.stat && data.stat === "ok"; - if (isOk) { - $.ajax({ - url: 'ws.php?format=json', - type: 'GET', - dataType: 'json', - data: { - method: 'pwg.images.getInfo', - image_id: pictureId, // corrected variable name - format: 'json' - }, - success: function(response) { - if (response.stat === 'ok') { - $("#picture-" + pictureId + " #name-" + pictureId).val(response.result.name); - $("#picture-" + pictureId + " #author-" + pictureId).val(response.result.author); - $("#picture-" + pictureId + " #date_creation-" + pictureId).val(response.result.date_creation); - $("#picture-" + pictureId + " #description-" + pictureId).val(response.result.comment); - $("#picture-" + pictureId + " #level-" + pictureId).val(response.result.level); - $("#picture-" + pictureId + " #filename-" + pictureId).text(response.result.file); - $("#picture-" + pictureId + " #filesize-" + pictureId).text(response.result.filesize); - $("#picture-" + pictureId + " #dimensions-" + pictureId).text(response.result.width + "x" + response.result.height); - showMetasyncSuccesBadge(pictureId); - enableLocalButton(pictureId) - } else { - console.error("Error:", response.message); - showErrorLocalBadge(pictureId); - enableLocalButton(pictureId) - } - }, - error: function(xhr, status, error) { - console.error("Error:", status, error); - showErrorLocalBadge(pictureId); - enableLocalButton(pictureId) - } - }); - } else { - showErrorLocalBadge(pictureId); - enableLocalButton(pictureId) - } - }, - error: function(data) { - console.error("Error occurred"); - enableLocalButton(pictureId) - } - }); + title: str_meta_warning, + draggable: false, + titleClass: "metadataSyncConfirm", + theme: "modern", + content: "", + animation: "zoom", + boxWidth: '30%', + useBootstrap: false, + type: 'red', + animateFromElement: false, + backgroundDismiss: true, + typeAnimated: false, + buttons: { + confirm: { + text: str_meta_yes, + btnClass: 'btn-red', + action: function() { + disableLocalButton(pictureId); + $.ajax({ + type: 'POST', + url: 'ws.php?format=json', + data: { + method: "pwg.images.syncMetadata", + pwg_token: jQuery("input[name=pwg_token]").val(), + image_id: pictureId + }, + dataType: 'json', + success: function(data) { + var isOk = data.stat && data.stat === "ok"; + if (isOk) { + updateBlock(pictureId); + } else { + showErrorLocalBadge(pictureId); + enableLocalButton(pictureId); } - }, - cancel: { - text: str_meta_no - } + }, + error: function(data) { + console.error("Error occurred"); + enableLocalButton(pictureId); + } + }); + } + }, + cancel: { + text: str_meta_no } + } }); -}); - - + }); // DELETE $('.action-delete-picture').on('click', function(event) { - var $fieldset = $(this).parents("fieldset"); - var pictureId = $fieldset.data("image_id"); - - - $.confirm({ - title: str_are_you_sure, - draggable: false, - titleClass: "groupDeleteConfirm", - theme: "modern", - content: "", - animation: "zoom", - boxWidth: '30%', - useBootstrap: false, - type: 'red', - animateFromElement: false, - backgroundDismiss: true, - typeAnimated: false, - buttons: { - confirm: { - text: str_yes, - btnClass: 'btn-red', - action: function () { - var image_ids = [pictureId]; - (function(ids) { - $.ajax({ - type: 'POST', - url: 'ws.php?format=json', - data: { - method: "pwg.images.delete", - pwg_token: jQuery("input[name=pwg_token]").val(), - image_id: ids.join(',') - }, - dataType: 'json', - success: function(data) { - var isOk = data.stat && data.stat === "ok"; - if (isOk) { - $fieldset.remove(); - $('.pagination-container').css({ - 'pointer-events': 'none', - 'opacity': '0.5' - }); - $('.button-reload').css('display', 'block'); - $('div[data-image_id="' + pictureId + '"]').css('display', 'flex'); - } else { - showErrorLocalBadge(pictureId); - } - }, - error: function(data) { - console.error("Error occurred"); - } - }); - })(image_ids); - - image_ids = []; + var $fieldset = $(this).parents("fieldset"); + var pictureId = $fieldset.data("image_id"); + $.confirm({ + title: str_are_you_sure, + draggable: false, + titleClass: "groupDeleteConfirm", + theme: "modern", + content: "", + animation: "zoom", + boxWidth: '30%', + useBootstrap: false, + type: 'red', + animateFromElement: false, + backgroundDismiss: true, + typeAnimated: false, + buttons: { + confirm: { + text: str_yes, + btnClass: 'btn-red', + action: function() { + var image_ids = [pictureId]; + (function(ids) { + $.ajax({ + type: 'POST', + url: 'ws.php?format=json', + data: { + method: "pwg.images.delete", + pwg_token: jQuery("input[name=pwg_token]").val(), + image_id: ids.join(',') + }, + dataType: 'json', + success: function(data) { + var isOk = data.stat && data.stat === "ok"; + if (isOk) { + $fieldset.remove(); + $('.pagination-container').css({ + 'pointer-events': 'none', + 'opacity': '0.5' + }); + $('.button-reload').css('display', 'block'); + $('div[data-image_id="' + pictureId + '"]').css('display', 'flex'); + } else { + showErrorLocalBadge(pictureId); } - }, - cancel: { - text: str_no - } + }, + error: function(data) { + console.error("Error occurred"); + } + }); + })(image_ids); + image_ids = []; } - }); + }, + cancel: { + text: str_no + } + } + }); }); - // VALIDATION - //Unit Save $('.action-save-picture').on('click', function(event) { - var $fieldset = $(this).parents("fieldset"); - var pictureId = $fieldset.data("image_id"); - saveChanges(pictureId); + var $fieldset = $(this).parents("fieldset"); + var pictureId = $fieldset.data("image_id"); + saveChanges(pictureId); }); - //Global Save $('.action-save-global').on('click', function(event) { saveAllChanges(); }); - - - - -//Categories - - $(".linked-albums.add-item").on("click", function () { - var pictureId = $(this).parents("fieldset").data("image_id") - linked_albums_open(pictureId); - set_up_popin(); + //Categories + $(".linked-albums.add-item").on("click", function() { + var pictureId = $(this).parents("fieldset").data("image_id") + linked_albums_open(pictureId); + set_up_popin(); }); - $(".limitReached").html(str_no_search_in_progress); $(".search-cancel-linked-album").hide(); $(".linkedAlbumPopInContainer .searching").hide(); - $("#linkedAlbumSearch .search-input").on('input', function () { + $("#linkedAlbumSearch .search-input").on('input', function() { var pictureId = $("#linkedAlbumSearch .search-input").parents(".linkedAlbumPopInContainer").attr("id"); - - if ($(this).val() != 0) { + if ($(this).val() != 0) { $("#linkedAlbumSearch .search-cancel-linked-album").show() - } else { + } else { $("#linkedAlbumSearch .search-cancel-linked-album").hide(); - } - - // Search input value length required to start searching - if ($(this).val().length > 0) { - - linked_albums_search($(this).val(), pictureId ); - } else { + } + // Search input value length required to start searching + if ($(this).val().length > 0) { + linked_albums_search($(this).val(), pictureId); + } else { $(".limitReached").html(str_no_search_in_progress); $("#searchResult").empty(); - } + } }) - - $(".search-cancel-linked-album").on("click", function () { - $("#linkedAlbumSearch .search-input").val(""); - $("#linkedAlbumSearch .search-input").trigger("input"); + $(".search-cancel-linked-album").on("click", function() { + $("#linkedAlbumSearch .search-input").val(""); + $("#linkedAlbumSearch .search-input").trigger("input"); }) - - $(".related-categories-container .breadcrumb-item .remove-item").on("click", function () { - var pictureId = $(this).parents("fieldset").data("image_id") - remove_related_category($(this).attr("id"),pictureId); + $(".related-categories-container .breadcrumb-item .remove-item").on("click", function() { + var pictureId = $(this).parents("fieldset").data("image_id") + remove_related_category($(this).attr("id"), pictureId); }) - + pluginFunctionMapInit(activePlugins); }) function fill_results(cats, pictureId) { - - $("#searchResult").empty(); - cats.forEach(cat => { - $("#searchResult").append( - "
" + - "" + cat.fullname +"" + - "
" - ); - var this_related_category_ids = window["related_category_ids_" + pictureId]; - var catId = parseInt(cat.id); - if (this_related_category_ids.includes(catId)) { - $(".search-result-item#"+ catId +" .item-add").addClass("notClickable").attr("title", str_already_in_related_cats).on("click", function (event) { - event.preventDefault(); - }); - $(".search-result-item").addClass("notClickable").attr("title", str_already_in_related_cats).on("click", function (event) { - event.preventDefault(); - }); - } else { - $(".search-result-item#"+ catId+ " .item-add").on("click", function () { - add_related_category(catId, cat.full_name_with_admin_links, pictureId); - }); - } - }); - } - - function remove_related_category(cat_id,pictureId) { - var catId = parseInt(cat_id); + $("#searchResult").empty(); + cats.forEach(cat => { + $("#searchResult").append( + "
" + + "" + cat.fullname + "" + + "
" + ); var this_related_category_ids = window["related_category_ids_" + pictureId]; - $("#"+pictureId+" .invisible-related-categories-select option[value="+ catId +"]").remove(); - $("#"+pictureId+" .invisible-related-categories-select").trigger('change'); - $("#"+pictureId+" #" + catId).parent().remove(); - - cat_to_remove_index = this_related_category_ids.indexOf(catId); - if (cat_to_remove_index > -1) { - this_related_category_ids.splice(cat_to_remove_index, 1); - } - check_related_categories(pictureId); - } - - function add_related_category(cat_id, cat_link_path, pictureId) { - var catId = parseInt(cat_id); - var this_related_category_ids = window["related_category_ids_" + pictureId]; - if (!this_related_category_ids.includes(catId)) { - $("#"+pictureId+" .related-categories-container").append( - "" - ); - - $(".search-result-item#" + catId).addClass("notClickable"); - this_related_category_ids.push(catId); - $(".invisible-related-categories-select").append("").trigger('change'); - - $("#"+ catId).on("click", function () { - remove_related_category(catId, pictureId); - }) - - linked_albums_close(); - } - - check_related_categories(pictureId); - } - - function check_related_categories(pictureId) { - var this_related_category_ids = window["related_category_ids_" + pictureId]; - - $("#picture-"+pictureId+" .linked-albums-badge").html(this_related_category_ids.length); - - if (this_related_category_ids.length == 0) { - $("#"+pictureId+" .linked-albums-badge").addClass("badge-red"); - $("#"+pictureId+" .add-item").addClass("highlight"); - $("#"+pictureId+" .orphan-photo").html(str_orphan).show(); + var catId = parseInt(cat.id); + if (this_related_category_ids.includes(catId)) { + $(".search-result-item#" + catId + " .item-add").addClass("notClickable").attr("title", str_already_in_related_cats).on("click", function(event) { + event.preventDefault(); + }); + $(".search-result-item").addClass("notClickable").attr("title", str_already_in_related_cats).on("click", function(event) { + event.preventDefault(); + }); } else { - $("#"+pictureId+" .linked-albums-badge.badge-red").removeClass("badge-red"); - $("#"+pictureId+" .add-item.highlight").removeClass("highlight"); - $("#"+pictureId+" .orphan-photo").hide(); + $(".search-result-item#" + catId + " .item-add").on("click", function() { + add_related_category(catId, cat.full_name_with_admin_links, pictureId); + }); } + }); +} + +function remove_related_category(cat_id, pictureId) { + var catId = parseInt(cat_id); + var this_related_category_ids = window["related_category_ids_" + pictureId]; + $("#" + pictureId + " .invisible-related-categories-select option[value=" + catId + "]").remove(); + $("#" + pictureId + " .invisible-related-categories-select").trigger('change'); + $("#" + pictureId + " #" + catId).parent().remove(); + cat_to_remove_index = this_related_category_ids.indexOf(catId); + if (cat_to_remove_index > -1) { + this_related_category_ids.splice(cat_to_remove_index, 1); } + check_related_categories(pictureId); +} - function updateUnsavedGlobalBadge() { - var visibleLocalUnsavedCount = $(".local-unsaved-badge").filter(function() { - return $(this).css('display') === 'block'; - }).length; +function add_related_category(cat_id, cat_link_path, pictureId) { + var catId = parseInt(cat_id); + var this_related_category_ids = window["related_category_ids_" + pictureId]; + if (!this_related_category_ids.includes(catId)) { + $("#" + pictureId + " .related-categories-container").append( + "" + ); + $(".search-result-item#" + catId).addClass("notClickable"); + this_related_category_ids.push(catId); + $(".invisible-related-categories-select").append("").trigger('change'); + $("#" + catId).on("click", function() { + remove_related_category(catId, pictureId); + }) + linked_albums_close(); + } + check_related_categories(pictureId); +} - if (visibleLocalUnsavedCount > 0) { - $(".global-unsaved-badge").css('display', 'block'); - $("#unsaved-count").text(visibleLocalUnsavedCount); - } else { - $(".global-unsaved-badge").css('display', 'none'); - $("#unsaved-count").text(''); - } +function check_related_categories(pictureId) { + var this_related_category_ids = window["related_category_ids_" + pictureId]; + $("#picture-" + pictureId + " .linked-albums-badge").html(this_related_category_ids.length); + if (this_related_category_ids.length == 0) { + $("#" + pictureId + " .linked-albums-badge").addClass("badge-red"); + $("#" + pictureId + " .add-item").addClass("highlight"); + $("#" + pictureId + " .orphan-photo").html(str_orphan).show(); + } else { + $("#" + pictureId + " .linked-albums-badge.badge-red").removeClass("badge-red"); + $("#" + pictureId + " .add-item.highlight").removeClass("highlight"); + $("#" + pictureId + " .orphan-photo").hide(); + } +} + +function updateUnsavedGlobalBadge() { + var visibleLocalUnsavedCount = $(".local-unsaved-badge").filter(function() { + return $(this).css('display') === 'block'; + }).length; + if (visibleLocalUnsavedCount > 0) { + $(".global-unsaved-badge").css('display', 'block'); + $("#unsaved-count").text(visibleLocalUnsavedCount); + } else { + $(".global-unsaved-badge").css('display', 'none'); + $("#unsaved-count").text(''); + } } function showUnsavedLocalBadge(pictureId) { - hideSuccesLocalBadge(pictureId); - hideErrorLocalBadge(pictureId); - $("#picture-" + pictureId + " .local-unsaved-badge").css('display', 'block'); - updateUnsavedGlobalBadge(); + hideSuccesLocalBadge(pictureId); + hideErrorLocalBadge(pictureId); + $("#picture-" + pictureId + " .local-unsaved-badge").css('display', 'block'); + updateUnsavedGlobalBadge(); } function hideUnsavedLocalBadge(pictureId) { - $("#picture-" + pictureId + " .local-unsaved-badge").css('display', 'none'); - updateUnsavedGlobalBadge(); + $("#picture-" + pictureId + " .local-unsaved-badge").css('display', 'none'); + updateUnsavedGlobalBadge(); } - $(window).on('beforeunload', function() { - if (user_interacted) { - return "You have unsaved changes, are you sure you want to leave this page?"; - } + if (user_interacted) { + return "You have unsaved changes, are you sure you want to leave this page?"; + } }); //Error badge function showErrorLocalBadge(pictureId) { $("#picture-" + pictureId + " .local-error-badge").css('display', 'block'); } + function hideErrorLocalBadge(pictureId) { $("#picture-" + pictureId + " .local-error-badge").css('display', 'none'); } - //Succes badge function updateSuccessGlobalBadge() { var visibleLocalSuccesCount = $(".local-success-badge").filter(function() { - return $(this).css('display') === 'block'; + return $(this).css('display') === 'block'; }).length; - if (visibleLocalSuccesCount > 0) { - showSuccesGlobalBadge() + showSuccesGlobalBadge() } else { - hideSuccesGlobalBadge() + hideSuccesGlobalBadge() } } function showSuccessLocalBadge(pictureId) { var badge = $("#picture-" + pictureId + " .local-success-badge"); badge.css({ - 'display': 'block', - 'opacity': 1 + 'display': 'block', + 'opacity': 1 }); - setTimeout(() => { - badge.fadeOut(1000, function() { - badge.css('display', 'none'); - }); + badge.fadeOut(1000, function() { + badge.css('display', 'none'); + }); }, 3000); } @@ -387,14 +335,13 @@ function hideSuccesLocalBadge(pictureId) { function showSuccesGlobalBadge() { var badge = $(".global-succes-badge"); badge.css({ - 'display': 'block', - 'opacity': 1 + 'display': 'block', + 'opacity': 1 }); - setTimeout(() => { - badge.fadeOut(1000, function() { - badge.css('display', 'none'); - }); + badge.fadeOut(1000, function() { + badge.css('display', 'none'); + }); }, 3000); } @@ -405,177 +352,193 @@ function hideSuccesGlobalBadge() { function showMetasyncSuccesBadge(pictureId) { var badge = $("#picture-" + pictureId + " .metasync-success"); badge.css({ - 'display': 'block', - 'opacity': 1 + 'display': 'block', + 'opacity': 1 }); - setTimeout(() => { - badge.fadeOut(1000, function() { - badge.css('display', 'none'); - }); + badge.fadeOut(1000, function() { + badge.css('display', 'none'); + }); }, 3000); } function disableLocalButton(pictureId) { $("#picture-" + pictureId + " .action-save-picture").addClass("disabled"); - $("#picture-" + pictureId + " .action-save-picture i").removeClass("icon-floppy").addClass("icon-spin6 animate-spin"); disableGlobalButton(); } function enableLocalButton(pictureId) { $("#picture-" + pictureId + " .action-save-picture").removeClass("disabled"); - $("#picture-" + pictureId + " .action-save-picture i").removeClass("icon-spin6 animate-spin").addClass("icon-floppy"); } function disableGlobalButton() { $(".action-save-global").addClass("disabled"); - $(".action-save-global i").removeClass("icon-floppy").addClass("icon-spin6 animate-spin"); } function enableGlobalButton() { $(".action-save-global").removeClass("disabled"); - $(".action-save-global i").removeClass("icon-spin6 animate-spin").addClass("icon-floppy"); } function saveChanges(pictureId) { - if ($("#picture-" + pictureId + " .local-unsaved-badge").css('display') === 'block') { - disableLocalButton(pictureId); - - // Retrieve Infos - var name = $("#name-" + pictureId).val(); - var author = $("#author-" + pictureId).val(); - var date_creation = $("#date_creation-" + pictureId).val(); - var comment = $("#description-" + pictureId).val(); - var level = $("#level-" + pictureId + " option:selected").val(); - - // Get Categories - var categories = []; - $("#picture-" + pictureId + " .remove-item").each(function() { - categories.push($(this).attr("id")); - }); - var categoriesStr = categories.join(';'); - - // Get Tags - var tags = []; - $("#tags-" + pictureId + " option").each(function() { - var tagId = $(this).val().replace(/~~/g, ''); - tags.push(tagId); - }); - var tagsStr = tags.join(','); - - $.ajax({ - url: 'ws.php?format=json', - method: 'POST', - data: { - method: 'pwg.images.setInfo', - image_id: pictureId, - name: name, - author: author, - date_creation: date_creation, - comment: comment, - categories: categoriesStr, - tag_ids: tagsStr, - level: level, - single_value_mode: "replace", - multiple_value_mode: "replace", - pwg_token: jQuery("input[name=pwg_token]").val() - }, - success: function(response) { - enableLocalButton(pictureId); - enableGlobalButton(); - hideUnsavedLocalBadge(pictureId); - showSuccessLocalBadge(pictureId); - updateSuccessGlobalBadge(); - pluginSaveLoop(activePlugins); //call for plugin save - }, - error: function(xhr, status, error) { - enableLocalButton(pictureId); - enableGlobalButton(); - hideUnsavedLocalBadge(pictureId); - showErrorLocalBadge(pictureId); - updateSuccessGlobalBadge(); - console.error('Error:', error); - } - }); - } else { + if ($("#picture-" + pictureId + " .local-unsaved-badge").css('display') === 'block') { + disableLocalButton(pictureId); + // Retrieve Infos + var name = $("#name-" + pictureId).val(); + var author = $("#author-" + pictureId).val(); + var date_creation = $("#date_creation-" + pictureId).val(); + var comment = $("#description-" + pictureId).val(); + var level = $("#level-" + pictureId + " option:selected").val(); + // Get Categories + var categories = []; + $("#picture-" + pictureId + " .remove-item").each(function() { + categories.push($(this).attr("id")); + }); + var categoriesStr = categories.join(';'); + // Get Tags + var tags = []; + $("#tags-" + pictureId + " option").each(function() { + var tagId = $(this).val().replace(/~~/g, ''); + tags.push(tagId); + }); + var tagsStr = tags.join(','); + $.ajax({ + url: 'ws.php?format=json', + method: 'POST', + data: { + method: 'pwg.images.setInfo', + image_id: pictureId, + name: name, + author: author, + date_creation: date_creation, + comment: comment, + categories: categoriesStr, + tag_ids: tagsStr, + level: level, + single_value_mode: "replace", + multiple_value_mode: "replace", + pwg_token: jQuery("input[name=pwg_token]").val() + }, + success: function(response) { + enableLocalButton(pictureId); + enableGlobalButton(); + hideUnsavedLocalBadge(pictureId); + showSuccessLocalBadge(pictureId); + updateSuccessGlobalBadge(); + // pluginSaveLoop(activePlugins); //call for plugin save + }, + error: function(xhr, status, error) { + enableLocalButton(pictureId); + enableGlobalButton(); + hideUnsavedLocalBadge(pictureId); + showErrorLocalBadge(pictureId); + updateSuccessGlobalBadge(); + console.error('Error:', error); } - } + }); + } else {} +} + function saveAllChanges() { $("fieldset").each(function() { var pictureId = $(this).data("image_id"); saveChanges(pictureId); }); } - //PLUGINS SAVE METHOD -var activePlugins = []; +var pluginFunctionMap = {}; -$.ajax({ - url: 'ws.php?format=json', - method: 'GET', - data: { - method: 'pwg.plugins.getList', - }, - success: function(response) { - console.log("AJAX call succeeded. Raw response: ", response); - console.log("Type of response: ", typeof response); - - if (typeof response === 'string') { - try { - response = JSON.parse(response); - console.log("Parsed response: ", response); - } catch (e) { - console.error("Failed to parse response as JSON: ", e); - } - } - - console.log("Response stat: ", response.stat); - console.log("Response result: ", response.result); - console.log("Is result an array? ", Array.isArray(response.result)); - - if (response.stat === "ok" && Array.isArray(response.result)) { - activePlugins = response.result.filter(function(plugin) { - return plugin.state === "active"; - }).map(function(plugin) { - return plugin.id; - }); - - console.log("Active plugins: ", activePlugins); - - } else { - console.error("Unexpected response format or status."); - } - }, - error: function(xhr, status, error) { - console.error("An error occurred: " + error); - } -}); - -function pluginSaveLoop(plugins) { - if (plugins.length === 0) { - console.log("No plugins to process in pluginSaveLoop."); - return; - } - plugins.forEach(function(pluginId) { +function pluginFunctionMapInit(activePlugins) { + activePlugins.forEach(function(pluginId) { var functionName = pluginId + '_batchManagerSave'; - if (typeof window[functionName] === 'function') { - window[functionName](); - console.log('Executed function: ' + functionName); + pluginFunctionMap[pluginId] = window[functionName]; } else { - console.log('Function not found: ' + functionName); + console.log('Function not found during initialization: ' + functionName); } }); } +function pluginSaveLoop(activePlugins) { + if (activePlugins.length === 0) { + console.log("No plugins to process in pluginSaveLoop."); + return; + } + activePlugins.forEach(function(pluginId) { + var saveFunction = pluginFunctionMap[pluginId]; + if (typeof saveFunction === 'function') { + saveFunction(); + console.log('Executed function for plugin: ' + pluginId); + } else { + console.log('Function not found for plugin: ' + pluginId); + } + }); +} +//UPDATE BLOCKS (Yet to be implemented) +function updateBlock(pictureId) { + $.ajax({ + url: 'ws.php?format=json', + type: 'GET', + dataType: 'json', + data: { + method: 'pwg.images.getInfo', + image_id: pictureId, + format: 'json' + }, + success: function(response) { + if (response.stat === 'ok') { + $("#picture-" + pictureId + " #name-" + pictureId).val(response.result.name); + $("#picture-" + pictureId + " #author-" + pictureId).val(response.result.author); + $("#picture-" + pictureId + " #date_creation-" + pictureId).val(response.result.date_creation); + $("#picture-" + pictureId + " #description-" + pictureId).val(response.result.comment); + $("#picture-" + pictureId + " #level-" + pictureId).val(response.result.level); + $("#picture-" + pictureId + " #filename-" + pictureId).text(response.result.file); + $("#picture-" + pictureId + " #filesize-" + pictureId).text(response.result.filesize); + $("#picture-" + pictureId + " #dimensions-" + pictureId).text(response.result.width + "x" + response.result.height); + // updateTags(response.result.tags, pictureId); //Yet to be implemented + showMetasyncSuccesBadge(pictureId); + enableLocalButton(pictureId); + enableGlobalButton(); + } else { + console.error("Error:", response.message); + showErrorLocalBadge(pictureId); + enableLocalButton(pictureId); + enableGlobalButton(); + } + }, + error: function(xhr, status, error) { + console.error("Error:", status, error); + showErrorLocalBadge(pictureId); + enableLocalButton(pictureId); + } + }); +} +//TAGS UPDATE Yet to be implemented +// function updateTags(tagsData, pictureId) { +// var $tagsUpdate = $('#tags-'+pictureId).selectize({ +// create: true, +// persist: false +// }); +// var selectizeTags = $tagsUpdate[0].selectize; +// var transformedData = tagsData.map(function(item) { +// return { +// value: item.id, +// text: item.name +// }; +// }) +// console.log(transformedData); +// selectizeTags.clearOptions(); +// selectizeTags.addOption(transformedData); +// selectizeTags.refreshOptions(true); +// }; + +//UNRELEASED LEVEL SLIDER // $(function () { // $('.privacy-filter-slider').each(function() { // var id = $(this).attr('id'); - // $(this).slider({ // range: 'min', // value: $(this).attr('value'), @@ -587,10 +550,7 @@ function pluginSaveLoop(plugins) { // }); // }); // }); - // function updateCertificationFilterLabel(value, id) { // let label = strs_privacy[value]; // $('#' + id + ' .privacy').html(label); -// } - - +// } \ No newline at end of file diff --git a/admin/themes/default/template/batch_manager_global.tpl b/admin/themes/default/template/batch_manager_global.tpl index 9d5424b3f..c1feda680 100644 --- a/admin/themes/default/template/batch_manager_global.tpl +++ b/admin/themes/default/template/batch_manager_global.tpl @@ -6,7 +6,7 @@ {combine_script id='jquery.ui.slider' require='jquery.ui' load='async' path='themes/default/js/ui/minified/jquery.ui.slider.min.js'} {combine_css path="themes/default/js/ui/theme/jquery.ui.slider.css"} -{combine_script id='doubleSlider' load='async' require='jquery.ui.slider' path='admin/themes/default/js/doubleSlider.js'} +{combine_script id='doubleSlider' load='footer' require='jquery.ui.slider' path='admin/themes/default/js/doubleSlider.js'} {combine_script id='LocalStorageCache' load='footer' path='admin/themes/default/js/LocalStorageCache.js'} @@ -311,46 +311,6 @@ $(document).ready(function() { jQuery("#sync_md5sum").toggle(jQuery(this).val() == "no_sync_md5sum"); }); }); - -{**} -var sliders = { - widths: { - values: [{$dimensions.widths}], - selected: { - min: {$dimensions.selected.min_width}, - max: {$dimensions.selected.max_width}, - }, - text: '{'between %d and %d pixels'|translate|escape:'javascript'}' - }, - - heights: { - values: [{$dimensions.heights}], - selected: { - min: {$dimensions.selected.min_height}, - max: {$dimensions.selected.max_height}, - }, - text: '{'between %d and %d pixels'|translate|escape:'javascript'}' - }, - - ratios: { - values: [{$dimensions.ratios}], - selected: { - min: {$dimensions.selected.min_ratio}, - max: {$dimensions.selected.max_ratio}, - }, - text: '{'between %.2f and %.2f'|translate|escape:'javascript'}' - }, - - filesizes: { - values: [{$filesize.list}], - selected: { - min: {$filesize.selected.min}, - max: {$filesize.selected.max}, - }, - text: '{'between %s and %s MB'|translate|escape:'javascript'}' - } -}; - {/footer_script} {combine_script id='jquery.confirm' load='footer' require='jquery' path='themes/default/js/plugins/jquery-confirm.min.js'} @@ -361,207 +321,10 @@ var sliders = {
- -
- {'Filter'|@translate} - -
-
    -
  • - -

    {'Predefined filter'|@translate}

    - [x] - - {'Empty caddie'|translate} - {if $NB_ORPHANS > 0} - {'Delete %d orphan photos'|translate:$NB_ORPHANS} - {/if} - {if $NB_NO_MD5SUM > 0} - {'Compute %d missing checksums'|translate:{$NB_NO_MD5SUM}} - {/if} - - - - - - - - - - - {'based on'|translate} - - - - - -
  • - -
  • - -

    {'Album'|@translate}

    - [x] - - -
  • - -
  • - -

    {'Tags'|@translate}

    - [x] - - - -
  • - -
  • - -

    {'Privacy level'|@translate}

    - [x] - - -
  • - -
  • - -

    {'Dimensions'|translate}

    - [x] -
    -
    -
    -
    - {'Width'|translate} {'between %d and %d pixels'|translate:$dimensions.selected.min_width:$dimensions.selected.max_width} -
    - {'Reset'|translate} -
    -
    - - - -
    - -
    -
    -
    - {'Height'|translate} {'between %d and %d pixels'|translate:$dimensions.selected.min_height:$dimensions.selected.max_height} -
    - {'Reset'|translate} -
    -
    - - - -
    - -
    -
    - {'Ratio'|translate} ({'Width'|@translate}/{'Height'|@translate}) - {'between %.2f and %.2f'|translate:$dimensions.selected.min_ratio:$dimensions.selected.max_ratio} -
    -
    -
    - {if isset($dimensions.ratio_portrait)} {'Portrait'|translate}{/if} - {if isset($dimensions.ratio_square)} {'square'|translate}{/if} - {if isset($dimensions.ratio_landscape)} {'Landscape'|translate}{/if} - {if isset($dimensions.ratio_panorama)} {'Panorama'|translate}{/if} -
    - -
    -
    - - - -
    -
    -
  • - - - -
  • - -

    {'Filesize'|translate}

    - [x] -
    -
    - {'between %s and %s MB'|translate:$filesize.selected.min:$filesize.selected.max} - {'Reset'|translate} -
    - - - -
    -
    -
  • -
- -
{'No filter, add one'|@translate}
- - -
- -
- + {include file='include/batch_manager_filter.inc.tpl' + title={'Batch Manager Filter'|@translate} + searchPlaceholder={'Filters'|@translate} + }
{'Selection'|@translate} diff --git a/admin/themes/default/template/batch_manager_unit.tpl b/admin/themes/default/template/batch_manager_unit.tpl index 0f59855b8..1253c413e 100644 --- a/admin/themes/default/template/batch_manager_unit.tpl +++ b/admin/themes/default/template/batch_manager_unit.tpl @@ -21,6 +21,8 @@ {combine_css path="admin/themes/default/fontello/css/animation.css" order=10} {footer_script} +{* *} +var activePlugins = {$ACTIVE_PLUGINS|json_encode}; (function(){ {* *} var tagsCache = new TagsCache({ @@ -73,219 +75,258 @@ const strs_privacy = { {combine_script id='batchManagerUnit' load='footer' require='jquery.ui.effect-blind,jquery.sort' path='admin/themes/default/js/batchManagerUnit.js'}
+
+ {debug}{if isset($ELEMENT_IDS)} +
+ +
+ {/if} + {*Filters*} + + {include file='include/batch_manager_filter.inc.tpl' title={'Batch Manager Filter'|@translate} searchPlaceholder={'Filters'|@translate}} + + + + Liste + {count($all_elements)} + + {if !empty($elements) } +
+
+ {'photos per page'|@translate} : + 5 + 10 + 50 +
+
+
+ {if !empty($navbar) } + + {include file='navigation_bar.tpl'|@get_extent:'navbar'}{/if} +
+
+
+ {foreach from=$elements item=element} + {footer_script} + var related_category_ids_{$element.ID} = {$element.related_category_ids}; + url_delete_{$element.id} = '{$element.U_DELETE}'; + {/footer_script} + +
+ +
+ #{$element.ID} +
+
+ imagename +
+
+ + + + + {if !url_is_remote($element.PATH)} + {* *} + + {/if} +
+ {if isset($element.U_JUMPTO)} + +

+ + {'Open in gallery'|@translate} +

+ {else} +
+

+ + {'Open in gallery'|translate} +

+ {/if} +
+
+
+
+
+
+ +
+ {$element.FILE} + {$element.DIMENSIONS} + {$element.FILESIZE} + {$element.EXT} +
+
+
+ +
+ {$element.POST_DATE} + {$element.AGE} + {$element.ADDED_BY} + {$element.STATS} +
+
+
+
+ {'Title'|@translate} + +
+
+ {'Creation date'|@translate} + + +
+
+ {'Author'|@translate} + +
+
+
+ {'Who can see ?'|@translate} + {'level of confidentiality'|@translate} +
+ + {* +
+
+ {'Who can see this photo?'|@translate} + +
+
+
+
+
+
+
+
+ *} +
+
+ {'Tags'|@translate} + +
+
+ {'Linked albums'|@translate} {$element.related_categories|@count} + {if $element.related_categories|@count + < 1} + {'This photo is an orphan'|@translate} + {else} + + {/if} + + +
+
+ {'Description'|@translate} + +
+
+
+
+ + {'Save'|@translate} +
+
+ + + +
+
+
+ {/foreach} +
+
+ {'Display'|@translate} + 5 + 10 + 50 +
+
+
+ {if !empty($navbar) } + + {include file='navigation_bar.tpl'|@get_extent:'navbar'}{/if} +
+
+
+ {/if} +
+ + + + +
+ + Save all photos +
+
+
-
- -{debug} -{if isset($ELEMENT_IDS)}
{/if} - -{*Filters*} -{include file='include/batch_manager_filter.inc.tpl' - title={'Batch Manager Filter'|@translate} - searchPlaceholder={'Filters'|@translate} -} - - -Liste {count($all_elements)} -{if !empty($elements) } - -
- -
- {'photos per page'|@translate} : - 5 - 10 - 50 -
-
-
- {if !empty($navbar) }{include file='navigation_bar.tpl'|@get_extent:'navbar'}{/if} -
-
- - -
-{foreach from=$elements item=element} - {footer_script} - var related_category_ids_{$element.ID} = {$element.related_category_ids}; - url_delete_{$element.id} = '{$element.U_DELETE}'; - {/footer_script} - - -
-
#{$element.ID}
-
- imagename -
-
- - - - - {if !url_is_remote($element.PATH)} - - - {/if} - -
- {if isset($element.U_JUMPTO)} - -

{'Open in gallery'|@translate}

- {else} -
-

{'Open in gallery'|translate}

- {/if} -
-
-
-
-
-
- -
- {$element.FILE} - {$element.DIMENSIONS} - {$element.FILESIZE} - {$element.EXT} - -
-
-
- -
- {$element.POST_DATE} - {$element.AGE} - {$element.ADDED_BY} - {$element.STATS} -
-
-
- -
- {'Title'|@translate} - -
- -
- {'Creation date'|@translate} - - - - -
- -
- {'Author'|@translate} - -
- -
-
- {'Who can see ?'|@translate} {'level of confidentiality'|@translate} -
- - {*
-
- {'Who can see this photo?'|@translate} - -
-
-
-
-
-
-
-
*} -
- -
- {'Tags'|@translate} - - -
- -
- {'Linked albums'|@translate} {$element.related_categories|@count} - {if $element.related_categories|@count < 1} - {'This photo is an orphan'|@translate} - {else} - - {/if} - - -
- -
- {'Description'|@translate} - -
-
-
-
{'Submit'|@translate}
-
- - - - - -
-
-
-{/foreach} - -
-
-{'Display'|@translate} -5 -10 -50 -
-
- -
- {if !empty($navbar) }{include file='navigation_bar.tpl'|@get_extent:'navbar'}{/if} -
-
- - -
-{/if} - -
- - - - -
Save all photos
-
- - {include file='include/album_selector.inc.tpl' title={'Associate to album'|@translate} diff --git a/admin/themes/default/template/include/batch_manager_filter.inc.tpl b/admin/themes/default/template/include/batch_manager_filter.inc.tpl index 91cc04d28..7798908a4 100644 --- a/admin/themes/default/template/include/batch_manager_filter.inc.tpl +++ b/admin/themes/default/template/include/batch_manager_filter.inc.tpl @@ -40,7 +40,6 @@ var sliders = { {/footer_script} {combine_script id='batchManagerFilter' load='footer' path='admin/themes/default/js/batchManagerFilter.js'} -
{'Filter'|@translate}
@@ -238,4 +237,3 @@ var sliders = {
-
\ No newline at end of file diff --git a/admin/themes/default/theme.css b/admin/themes/default/theme.css index 89c8c4341..9b0e7b3f5 100644 --- a/admin/themes/default/theme.css +++ b/admin/themes/default/theme.css @@ -2286,6 +2286,13 @@ h2:lang(en) { text-transform:capitalize; } border-left:4px solid #6DCE5E; } +.metasync-success { + position: absolute; + top: -15px; + left: 50%; + transform: translateX(-50%); +} + .badge { background-color:#0a0; color:white; @@ -2296,6 +2303,10 @@ h2:lang(en) { text-transform:capitalize; } margin-left:5px; } +.buttonSubmitLocal { + margin-left: 9px !important; +} + .infos li, .errors li, .warnings li, .messages li { list-style-type:none; } .infos .submit {margin-left:30px;} @@ -3424,7 +3435,6 @@ LEGEND SPAN { .media-hover{ opacity:0%; - background-color: #0000009c; position: relative; height: 100%; width: 100%; @@ -3432,6 +3442,7 @@ LEGEND SPAN { .media-hover:hover{ opacity: 100%; + transition: ease-in-out 0.3s; } .main-info-container{ @@ -3679,8 +3690,6 @@ LEGEND SPAN { display: flex; justify-content: center; align-items: center; - width: 90px; - height: 45px; } .disabled { @@ -3741,7 +3750,7 @@ LEGEND SPAN { #batchManagerGlobal #selectedMessage {padding:5px; border-radius:5px; float: right;} #batchManagerGlobal #applyOnDetails {text-align: center; margin-top: 8px; color: #FFA646; font-weight: bold;} #batchManagerGlobal .actionButtons {text-align:left; display: flex; flex-direction: column;} -#batchManagerGlobal #filterList {padding-left:0px; display: flex; flex-wrap: wrap; align-items: start; margin-top: 0px;} +#batchManagerGlobal #filterList {padding-left:0px; display: flex; flex-wrap: wrap; align-items: start; margin-top: 0px; margin-bottom: 10px !important;} #batchManagerGlobal #filterList li { list-style-type:none; background-color: #fafafa; diff --git a/include/ws_functions/pwg.images.php b/include/ws_functions/pwg.images.php index fdda46ad0..48bec1e1a 100644 --- a/include/ws_functions/pwg.images.php +++ b/include/ws_functions/pwg.images.php @@ -2290,7 +2290,6 @@ SELECT path */ function ws_images_setInfo($params, $service) { - sleep(5); global $conf; if (isset($params['pwg_token']) and get_pwg_token() != $params['pwg_token']) diff --git a/language/en_UK/admin.lang.php b/language/en_UK/admin.lang.php index a54ab540f..17a1d36ea 100644 --- a/language/en_UK/admin.lang.php +++ b/language/en_UK/admin.lang.php @@ -1366,4 +1366,5 @@ $lang['An error has occured'] = 'An error has occured'; $lang['image(s) contains unsaved changes'] = 'image(s) contains unsaved changes'; $lang['Pagination has changed and needs to be reloaded !'] = 'Pagination has changed and needs to be reloaded !'; $lang['Metadata sync complete'] = 'Metadata sync complete'; +$lang['Save'] = 'Save'; // Leave this line empty diff --git a/language/fr_FR/admin.lang.php b/language/fr_FR/admin.lang.php index a06b0a166..9e15bef63 100644 --- a/language/fr_FR/admin.lang.php +++ b/language/fr_FR/admin.lang.php @@ -1366,4 +1366,5 @@ $lang['An error has occured'] = 'Une erreur est survenue'; $lang['image(s) contains unsaved changes'] = 'image(s) ne sont pas sauvegardées'; $lang['Pagination has changed and needs to be reloaded !'] = "La pagination a changée et nécessite d'être rechargée !"; $lang['Metadata sync complete'] = 'Méta-données synchronisées'; +$lang['Save'] = 'Enregistrer'; // Leave this line empty