428 lines
17 KiB
JavaScript
428 lines
17 KiB
JavaScript
jQuery(document).ready(function($)
|
|
{
|
|
// get URL parameters
|
|
urlParams = new URLSearchParams(window.location.search);
|
|
paramYear = (urlParams.get('years') == null ? urlParams.getAll('year') : urlParams.getAll('years'));
|
|
paramMonth = (urlParams.get('months') == null ? urlParams.getAll('month') : urlParams.getAll('months'));
|
|
paramDimension = (urlParams.get('dimensions') == null ? urlParams.getAll('dimension') : urlParams.getAll('dimensions'));
|
|
paramTheme = (urlParams.get('themes') == null ? urlParams.getAll('theme') : urlParams.getAll('themes'));
|
|
paramCategory = (urlParams.get('categories') == null ? urlParams.getAll('category') : urlParams.getAll('categories'));
|
|
paramPlace = (urlParams.get('places') == null ? urlParams.getAll('place') : urlParams.getAll('places'));
|
|
paramTag = (urlParams.get('tags') == null ? urlParams.getAll('tag') : urlParams.getAll('tags'));
|
|
paramPhoto = (urlParams.get('photos') == null ? urlParams.getAll('photo') : urlParams.getAll('photos'));
|
|
paramHelp = (urlParams.get('helps') == null ? urlParams.getAll('help') : urlParams.getAll('helps'));
|
|
|
|
$.getJSON("data.json", function(data)
|
|
{
|
|
|
|
/**********/
|
|
/** MENU **/
|
|
/**********/
|
|
|
|
var dimensions = [];
|
|
var themes = [];
|
|
var categories = [];
|
|
var places = [];
|
|
var tags = [];
|
|
|
|
function generateMenu()
|
|
{
|
|
for (i of data)
|
|
{
|
|
if (dimensions.indexOf(i.dimension) === -1 && i.dimension != "" && i.dimension != "—")
|
|
dimensions.push(i.dimension);
|
|
if (themes.indexOf(i.theme) === -1 && i.theme != "" && i.theme != "—")
|
|
themes.push(i.theme);
|
|
if (categories.indexOf(i.category) === -1 && i.category != "" && i.category != "—")
|
|
categories.push(i.category);
|
|
if (places.indexOf(i.place) === -1 && i.place != "" && i.place != "—")
|
|
places.push(i.place);
|
|
if (tags.indexOf(i.tags) === -1 && i.tags != "" && i.tags != "—")
|
|
{
|
|
splitTags = i.tags.split(", ");
|
|
for (splitTag of splitTags) {
|
|
if (tags.indexOf(splitTag) === -1)
|
|
{
|
|
tags.push(splitTag);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
dimensions.sort();
|
|
themes.sort();
|
|
categories.sort();
|
|
places.sort();
|
|
tags.sort();
|
|
|
|
for (dimension of dimensions)
|
|
{
|
|
html = '<span><input type="checkbox" id="' + dimension + '" name="dimension" value="' + dimension + '"></input>\n';
|
|
html += '<label for="' + dimension + '">' + dimension + '</label></span>';
|
|
$(".box.dimensions .item-cont").append(html);
|
|
}
|
|
for (theme of themes)
|
|
{
|
|
html = '<span><input type="checkbox" id="' + theme + '" name="theme" value="' + theme + '"></input>\n';
|
|
html += '<label for="' + theme + '">' + theme + '</label></span>';
|
|
$(".box.themes .item-cont").append(html);
|
|
}
|
|
for (category of categories)
|
|
{
|
|
html = '<span><input type="checkbox" id="' + category + '" name="category" value="' + category + '"></input>\n';
|
|
html += '<label for="' + category + '">' + category + '</label></span>';
|
|
$(".box.categories .item-cont").append(html);
|
|
}
|
|
for (place of places)
|
|
{
|
|
html = '<span><input type="checkbox" id="' + place + '" name="place" value="' + place + '"></input>\n';
|
|
html += '<label for="'+place+'">' + place + '</label></span>';
|
|
$(".box.places .item-cont").append(html);
|
|
}
|
|
for (tag of tags)
|
|
{
|
|
html = '<span><input type="checkbox" id="' + tag + '" name="tag" value="' + tag + '"></input>\n';
|
|
html += '<label for="'+tag+'">' + tag + '</label></span>';
|
|
$(".box.tags .item-cont").append(html);
|
|
}
|
|
|
|
// populate checkboxes depending on URL
|
|
function checkBoxSelector(names, name, urlParam)
|
|
{
|
|
if (urlParam == "all")
|
|
{
|
|
$('input[name="'+names+'"]').prop("checked", true);
|
|
$('input[name="'+name+'"]').prop("disabled", true);
|
|
$('input[name="'+name+'"]').prop("checked", true);
|
|
}
|
|
else
|
|
{
|
|
for (a of urlParam)
|
|
{
|
|
$('input[id="'+a+'"]').prop("checked", true);
|
|
}
|
|
}
|
|
}
|
|
|
|
checkBoxSelector("years", "year", paramYear)
|
|
checkBoxSelector("months", "month", paramMonth);
|
|
checkBoxSelector("dimensions", "dimension", paramDimension);
|
|
checkBoxSelector("themes", "theme", paramTheme);
|
|
checkBoxSelector("categories", "category", paramCategory);
|
|
checkBoxSelector("places", "place", paramPlace);
|
|
checkBoxSelector("tags", "tag", paramTag);
|
|
checkBoxSelector("photos", "photo", paramPhoto);
|
|
checkBoxSelector("helps", "help", paramHelp);
|
|
}
|
|
|
|
// if "all" is selected, check all other options and disable them
|
|
function AllCheckBoxSelector(names, name)
|
|
{
|
|
$('input[id="' + names + '"]').click(function()
|
|
{
|
|
if ($(this).prop("checked") == true)
|
|
{
|
|
$('input[name="' + name + '"]').prop("checked", true);
|
|
$('input[name="' + name + '"]').prop("disabled", true);
|
|
}
|
|
else if ($(this).prop("checked") == false)
|
|
{
|
|
$('input[name="' + name + '"]').prop("checked", false);
|
|
$('input[name="' + name + '"]').prop("disabled", false);
|
|
}
|
|
});
|
|
}
|
|
|
|
$("input").prop("checked", false); // by default, uncheck all options
|
|
|
|
AllCheckBoxSelector("years", "year");
|
|
AllCheckBoxSelector("months", "month");
|
|
AllCheckBoxSelector("dimensions", "dimension");
|
|
AllCheckBoxSelector("themes", "theme");
|
|
AllCheckBoxSelector("categories", "category");
|
|
AllCheckBoxSelector("places", "place");
|
|
AllCheckBoxSelector("tags", "tag");
|
|
AllCheckBoxSelector("photos", "photo");
|
|
AllCheckBoxSelector("helps", "help");
|
|
|
|
// menu configurer show / hide
|
|
$("article.explorer h2").click(function()
|
|
{
|
|
if ($(this).hasClass("active"))
|
|
{
|
|
$(this).removeClass("active");
|
|
$("form").slideUp(200);
|
|
}
|
|
else
|
|
{
|
|
$(this).addClass("active");
|
|
$("form").slideDown(200);
|
|
}
|
|
});
|
|
|
|
// menu configurer child on mobile show/hide
|
|
if ($(window).width() <= 600)
|
|
{
|
|
$("article.explorer .box h3").click(function()
|
|
{
|
|
if ($(this).parent().hasClass("active"))
|
|
{
|
|
$(this).parent().removeClass("active");
|
|
$(this).parent().children(".item-cont").slideUp(200);
|
|
}
|
|
else
|
|
{
|
|
$(this).parent().addClass("active");
|
|
$(this).parent().children(".item-cont").slideDown(200);
|
|
}
|
|
});
|
|
}
|
|
|
|
|
|
/*********************/
|
|
/** TABLE & GALLERY **/
|
|
/*********************/
|
|
|
|
function checkYear(year)
|
|
{
|
|
if (paramYear == "all") return true;
|
|
if (paramYear.includes("50s") && year >= 1950 && year <= 1959) return true;
|
|
if (paramYear.includes("60s") && year >= 1960 && year <= 1969) return true;
|
|
if (paramYear.includes("70s") && year >= 1970 && year <= 1979) return true;
|
|
if (paramYear.includes("80s") && year >= 1980 && year <= 1989) return true;
|
|
if (paramYear.includes("90s") && year >= 1990 && year <= 1999) return true;
|
|
if (paramYear.includes("00s") && year >= 2000 && year <= 2009) return true;
|
|
if (paramYear.includes("10s") && year >= 2010 && year <= 2020) return true;
|
|
return false;
|
|
}
|
|
|
|
function checkMonth(month)
|
|
{
|
|
if (paramMonth == "all") return true;
|
|
if (paramMonth.includes("01") && month == "janvier") return true;
|
|
if (paramMonth.includes("02") && month == "février") return true;
|
|
if (paramMonth.includes("03") && month == "mars") return true;
|
|
if (paramMonth.includes("04") && month == "avril") return true;
|
|
if (paramMonth.includes("05") && month == "mai") return true;
|
|
if (paramMonth.includes("06") && month == "juin") return true;
|
|
if (paramMonth.includes("07") && month == "juillet") return true;
|
|
if (paramMonth.includes("08") && month == "août") return true;
|
|
if (paramMonth.includes("09") && month == "septembre") return true;
|
|
if (paramMonth.includes("10") && month == "octobre") return true;
|
|
if (paramMonth.includes("11") && month == "novembre") return true;
|
|
if (paramMonth.includes("12") && month == "décembre") return true;
|
|
return false;
|
|
}
|
|
|
|
function checkDimension(dimension)
|
|
{
|
|
if (paramDimension == "all")
|
|
return true;
|
|
if (paramDimension.includes(dimension))
|
|
return true;
|
|
return false;
|
|
}
|
|
|
|
function checkTheme(theme)
|
|
{
|
|
if (paramTheme == "all")
|
|
return true;
|
|
if (paramTheme.includes(theme))
|
|
return true;
|
|
return false;
|
|
}
|
|
|
|
function checkCategory(category)
|
|
{
|
|
if (paramCategory == "all")
|
|
return true;
|
|
if (paramCategory.includes(category))
|
|
return true;
|
|
return false;
|
|
}
|
|
|
|
function checkPlace(place)
|
|
{
|
|
if (paramPlace == "all")
|
|
return true;
|
|
if (paramPlace.includes(place))
|
|
return true;
|
|
return false;
|
|
}
|
|
|
|
function checkTag(tag)
|
|
{
|
|
if (paramTag == "all")
|
|
return true;
|
|
splitTag = tag.split(", ");
|
|
|
|
for (t of splitTag)
|
|
{
|
|
if (paramTag.includes(t))
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function checkPhoto(photo)
|
|
{
|
|
if (paramPhoto == "all") return true;
|
|
if (paramPhoto.includes("none") && photo == "none") return true;
|
|
if (paramPhoto.includes("bad") && photo == "bad") return true;
|
|
if (paramPhoto.includes("ok") && photo == "ok") return true;
|
|
if (paramPhoto.includes("good") && photo == "good") return true;
|
|
return false;
|
|
}
|
|
|
|
function checkHelp(help)
|
|
{
|
|
if (paramHelp == "all") return true;
|
|
if (paramHelp.includes("no") && help == "no") return true;
|
|
if (paramHelp.includes("yes") && help == "yes") return true;
|
|
return false;
|
|
}
|
|
|
|
function generateTable()
|
|
{
|
|
hasResult = false;
|
|
|
|
for (i of data)
|
|
{
|
|
if (urlParams.toString() === "") // no parameter in URL
|
|
res = false;
|
|
else
|
|
res = true;
|
|
|
|
// check URL parameters and compute result
|
|
if (paramYear != "") res &&= checkYear(i.year);
|
|
if (paramMonth != "") res &&= checkMonth(i.month);
|
|
if (paramDimension != "") res &&= checkDimension(i.dimension);
|
|
if (paramTheme != "") res &&= checkTheme(i.theme);
|
|
if (paramCategory != "") res &&= checkCategory(i.category);
|
|
if (paramPlace != "") res &&= checkPlace(i.place);
|
|
if (paramTag != "") res &&= checkTag(i.tags);
|
|
if (paramPhoto != "") res &&= checkPhoto(i.photo);
|
|
if (paramHelp != "") res &&= checkHelp(i.help);
|
|
|
|
if (!res)
|
|
continue;
|
|
|
|
hasResult = true;
|
|
|
|
// table
|
|
$("table").css("display", "block");
|
|
|
|
result = "<tr>";
|
|
result += "<td>" + i.number + "</td>";
|
|
result += "<td>" + i.title + "</td>";
|
|
result += "<td>" + i.year + "</td>";
|
|
result += "<td>" + i.dimension + "</td>";
|
|
result += "<td>" + i.theme + "</td>";
|
|
result += "<td>" + i.category + "</td>";
|
|
result += "<td>" + i.place + "</td>";
|
|
result += "<td>" + i.tags + "</td>";
|
|
|
|
if (i.photo == "good")
|
|
result += '<td class="photo">★★★</td>';
|
|
else if (i.photo == "ok")
|
|
result += '<td class="photo">★★</td>';
|
|
else if (i.photo == "bad")
|
|
result += '<td class="photo">★</td>';
|
|
else if (i.photo == "none")
|
|
result += '<td class="photo">☆</td>';
|
|
|
|
if (i.help == "yes")
|
|
result += '<td class="help">‼︎</td>'
|
|
else
|
|
result += '<td> </td>'
|
|
|
|
result += '<td><a href="painting.html?number=' + i.number + '"><img src="styles/icons/eye.svg"></a></td>';
|
|
result += "</tr>";
|
|
|
|
$("table").append(result);
|
|
|
|
// gallery
|
|
if (i.photo == "none")
|
|
{
|
|
paintingHtml = '<a data-fancybox="exposition" href="images/unknown.jpg" data-fancybox-index="' + i.number + '">'
|
|
paintingHtml += '<img src="images/unknown.jpg"></a>'
|
|
}
|
|
else
|
|
{
|
|
paintingHtml = '<a data-fancybox="exposition" href="photos/paintings/normal/' + i.number + '.jpg" data-fancybox-index="' + i.number + '">'
|
|
paintingHtml += '<img src="photos/paintings/mini/' + i.number + '.jpg"></a>'
|
|
}
|
|
$("#gallery").append(paintingHtml);
|
|
}
|
|
return hasResult;
|
|
}
|
|
|
|
$("#gallery").hide();
|
|
$(".style-select").hide();
|
|
|
|
generateMenu();
|
|
var res = generateTable();
|
|
|
|
if (res) // display table or no result depending of computed result
|
|
{
|
|
$(".style-select").show();
|
|
$("article.explorer h2").removeClass("active")
|
|
$("form").slideUp(200);
|
|
}
|
|
else
|
|
$("article.explorer p.no-result").css("display", "block");
|
|
|
|
// on mobile, show only the first item slided down
|
|
if ($(window).width() <= 600)
|
|
{
|
|
$("article.explorer .container .box").each(function()
|
|
{
|
|
if (!$(this).hasClass('active'))
|
|
{
|
|
$(this).children(".item-cont").slideUp(200);
|
|
}
|
|
});
|
|
}
|
|
|
|
// change display: gallery/table
|
|
$(".style-select.frame").click(function()
|
|
{
|
|
$("table").hide();
|
|
$("#gallery").show();
|
|
})
|
|
$(".style-select.list").click(function()
|
|
{
|
|
$("#gallery").hide();
|
|
$("table").show();
|
|
})
|
|
|
|
|
|
// fancybox configuration
|
|
$('[data-fancybox="exposition"]').fancybox(
|
|
{
|
|
infobar: false,
|
|
toolbar: true,
|
|
smallBtn: false,
|
|
buttons: ["arrowLeft", "arrowRight", "close"],
|
|
arrows: false,
|
|
transitionEffect: "fade",
|
|
baseClass: 'fancybox-custom-layout',
|
|
mobile: {
|
|
preventCaptionOverlap: true,
|
|
},
|
|
|
|
caption: function(instance, item)
|
|
{
|
|
var idx = item.opts.fancyboxIndex - 1; // painting number
|
|
return '\
|
|
<div id="info">\
|
|
<span class="info"><a href="painting.html?number=' + data[idx].number + '">ℹ︎</span></a></span>\
|
|
<span class="title">' + data[idx].title + '</span><span class="year">' + (data[idx].month != '—' ? data[idx].month + ' ' : '') + data[idx].year + '</span>\
|
|
<span class="format">' + data[idx].paint + ' sur ' + data[idx].support + ' (' + data[idx].dimension + ')</span>\
|
|
<span class="comment">' + data[idx].comment + '</span>\
|
|
</div>\
|
|
';
|
|
}
|
|
});
|
|
});
|
|
}); |