Files
Piwigo/admin/themes/default/js/plugins_new.js
2022-03-05 11:52:53 +01:00

317 lines
9.8 KiB
JavaScript

// <-- Define sort orders -->
var sortOrder = 'date';
var sortPlugins = (function (a, b) {
if (sortOrder == 'downloads' || sortOrder == 'revision' || sortOrder == 'date')
return parseInt($(a).data(sortOrder))
< parseInt($(b).data(sortOrder)) ? 1 : -1;
else
return $(a).data(sortOrder).toLowerCase()
> $(b).data(sortOrder).toLowerCase() ? 1 : -1;
});
$(function () {
// <-- Set the advanced filters -->
let betaTestPlugins = $('#showBetaTestPlugin')[0].hasAttribute('checked');
// object that remember filters states (initialized later)
let filters = {};
// toggle advanced filter's panel
$(".advanced-filter-btn").click(advanced_filter_button_click);
$(".advanced-filter span.icon-cancel").click(advanced_filter_hide);
function advanced_filter_button_click() {
if (!$(".advanced-filter").hasClass("advanced-filter-open")) {
advanced_filter_show();
} else {
advanced_filter_hide();
}
}
function advanced_filter_show() {
$(".advanced-filter-btn, .advanced-filter").addClass("advanced-filter-open");
}
function advanced_filter_hide() {
$(".advanced-filter-btn, .advanced-filter").removeClass("advanced-filter-open");
}
jQuery('select[name="selectOrder"]').change(function () {
sortOrder = this.value;
$('.pluginBox').sortElements(sortPlugins);
$.get("admin.php?plugins_new_order=" + sortOrder);
});
jQuery('#search').on("input", function () {
applyFilter('search', this.value.toUpperCase());
jQuery("#search").trigger("click");
});
$('.search-cancel').on('click', () => {
applyFilter('search', '');
})
$(".buttonInstall").each(function () {
let plugin_name = $(this).closest(".pluginBox").data('name');
$(this).pwg_jconfirm_follow_href({
alert_title: str_install_title.replace("%s", plugin_name),
alert_confirm: str_confirm_msg,
alert_cancel: str_cancel_msg
});
});
jQuery('.certification').tipTip({
'delay': 0,
'fadeIn': 200,
'fadeOut': 200
});
$('.pluginRating').each((i, node) => {
let ratingContainer = $(node);
let rating = ratingContainer.data('rating');
displayStars(ratingContainer.find('.rating-star-container'), rating);
})
// put default values in the select
let authorNames = [{ value: '', text: "-" }];
let tagsNames = [{ value: '', text: "-" }]
// read all plugin boxes to get author and tags
$('.pluginBox').each((i,el) => {
let author = $(el).data('author');
author.split(', ').forEach(name => {
if (!authorNames.find(el => el.value == name)) {
authorNames.push({ value: name, text: name})
}
});
let tags = $(el).data('tags');
tags.split(', ').forEach(tag => {
if (!tagsNames.find(el => el.value == tag)) {
tagsNames.push({ value: tag, text: tag })
}
});
})
// initialize the Selectize control
$select = $('#author-filter').selectize({
onChange: function (value) {
applyFilter('author', value);
},
plugins: ['remove_button'],
});
// fetch the instance
let selectizeAuthor = $select[0].selectize;
selectizeAuthor.addOption(authorNames);
// initialize the Selectize control
$select = $('#tag-filter').selectize({
onChange: function (value) {
applyFilter('tag', value);
},
plugins: ['remove_button'],
});
// fetch the instance
let selectizeTag = $select[0].selectize;
selectizeTag.addOption(tagsNames);
$('.notation-filter-slider').slider({
range: 'min',
value: 0,
min: 0,
max: 5,
step: 0.5,
slide: function(event, ui) {
updateRatingFilterLabel(ui.value);
applyFilter("rating", ui.value);
}
})
$('.revision-date-filter-slider').slider({
range: 'min',
value: 0,
min: 0,
max: 6,
slide: function (event, ui) {
let month;
[month, _] = value_to_month(ui.value);
updateRevisionFilterLabel(ui.value);
applyFilter("revision", month);
}
});
// All the slider values and it's corresponding month's number and label
function value_to_month(val) {
switch (val) {
case 6:
return [1, str_x_month.replace('%d', 1)];
break;
case 5:
return [3, str_x_months.replace('%d', 3)];
break;
case 4:
return [6, str_x_months.replace('%d', 6)];
break;
case 3:
return [12, str_x_year.replace('%d', 1)];
break;
case 2:
return [24, str_x_years.replace('%d', 2)];
break;
case 1:
return [60, str_x_years.replace('%d', 5)];
break;
default:
return [Number.MAX_SAFE_INTEGER, str_from_begining];
break;
}
}
// The certification filter dosen't include incompatible if the beta-test option is not checked
let minCertification = betaTestPlugins ? -1 : 0;
$('.certification-filter-slider').slider({
range: 'min',
value: minCertification,
min: minCertification,
max: 3,
slide: function (event, ui) {
updateCertificationFilterLabel(ui.value);
applyFilter("certification", ui.value);
}
});
// Diffrence between two dates, in months
function monthDiff(d1, d2) {
var months;
months = (d2.getFullYear() - d1.getFullYear()) * 12;
months -= d1.getMonth();
months += d2.getMonth();
return months <= 0 ? 0 : months;
}
updateRatingFilterLabel(0);
updateCertificationFilterLabel(minCertification);
updateRevisionFilterLabel(0);
function displayStars(element, rating) {
element.find('span').addClass('icon-star-empty');
element.find('span i').attr('class','');
rating = Math.round(rating * 2);
if (rating % 2 == 1) {
$(element).find('span[data-star=' + ((rating - 1) / 2) + '] i').addClass('icon-star-half')
rating -= 1;
}
while (rating > 0) {
rating -= 2;
$(element).find('span[data-star=' + (rating / 2) + '] i').addClass('icon-star')
$(element).find('span[data-star=' + (rating / 2) + ']').removeClass('icon-star-empty')
}
}
// Updates labels when input change
function updateRatingFilterLabel(value) {
displayStars($('.advanced-filter-rating .rating-star-container'), value);
}
function updateCertificationFilterLabel(value) {
let certifNode = $('.advanced-filter-certification .certification');
certifNode.attr('data-certification', value);
certifNode.attr('title', strs_certification[String(value)]);
certifNode.tipTip({
'delay': 0,
'fadeIn': 200,
'fadeOut': 200
});
}
function updateRevisionFilterLabel(val) {
let label;
[_, label] = value_to_month(val);
$('.revision-date').html(label);
}
// <-- Apply advanced filters -->
// object that remember filters states
filters = {
"search": $('#search').val(),
"author": '',
"tag": '',
"rating": $('.notation-filter-slider').slider('value'),
"certification": $('.certification-filter-slider').slider('value'),
"revision": value_to_month($('.certification-filter-slider').slider('value'))[0],
}
selectizeAuthor.setValue('');
selectizeTag.setValue('');
function applyFilter(changed, value) {
filters[changed] = value;
sort((pluginBox) => {
let pluginRating = pluginBox.find('.pluginRating').data('rating') || 0;
let pluginCertification = pluginBox.find('.certification').data('certification');
let pluginAuthors = pluginBox.data('author').split(', ');
let pluginName = pluginBox.data('name').toUpperCase();
let pluginTags = pluginBox.data('tags').split(', ');
let pluginRevisionOld = monthDiff(new Date(pluginBox.data('revision')*1000), new Date()); // number of months between the last revision date and now
return (pluginRating >= filters.rating)
&& (pluginCertification >= filters.certification)
&& (filters.search === '' || pluginName.indexOf(filters.search) != -1)
&& (filters.author === '' || pluginAuthors.includes(filters.author))
&& (filters.tag === '' || pluginTags.includes(filters.tag))
&& pluginRevisionOld <= filters['revision'];
})
}
// Display or not plugin with a function handler
function sort(sortFunction) {
$('.pluginBox').each((i, el) => {
if (sortFunction($(el))) {
$(el).show();
} else {
$(el).hide();
}
})
}
function clearSort() {
$('.pluginBox').show();
}
// Crop the names of plugins if there are too long
$('.pluginName span').each((i,el) => {
let name = $(el)
if (name.html().length > 30) {
name.html(name.html().slice(0,30) + '...');
}
})
$('#showBetaTestPlugin').on('change', (e) => {
$('.beta-test-plugin-switch .slider').addClass('loading');
let queryParams = new URLSearchParams(window.location.search);
queryParams.set("beta-test", e.currentTarget.checked.toString());
history.replaceState(null, null, "?" + queryParams.toString());
window.location.reload(true);
})
});