3 const dialog = document.getElementById('main-menu');
4 let buttonOn = $('.js-menu');
5 let buttonOff = $('.js-menu-close');
7 async function closeMenu() {
8 // Może być od razu dialog.close bez is-closing, gdy przeglądarki nadrobią
9 // https://caniuse.com/wf-display-animation, https://caniuse.com/wf-overlay
10 if (!dialog.open || dialog.classList.contains('is-closing')) return;
11 dialog.classList.add('is-closing');
12 buttonOn.find('.bar').removeClass('animate');
13 buttonOff.find('.bar').removeClass('animate');
14 await Promise.allSettled(dialog.getAnimations().map(a => a.finished));
17 dialog.addEventListener('close', () => {
18 dialog.classList.remove('is-closing');
21 document.querySelector('.js-menu').addEventListener('click', () => {
23 buttonOn.find('.bar').addClass('animate');
24 buttonOff.find('.bar').addClass('animate');
27 dialog.querySelector('.js-menu-close').addEventListener('click', closeMenu);
28 dialog.addEventListener('cancel', e => {
35 // Ebook/Audiobook Btns
37 let button = $('.c-media__btn button:not(.l-button--media--full)');
38 let popupLayer = $('.c-media__popup');
39 let closeButton = $('.c-media__popup__close');
40 let playButton = $('.c-player__btn--md');
41 let chaptersButton = $('.c-player__chapters span');
42 let select = $('.c-select');
43 let selectItem = $('.c-select li');
44 let volumeButton = $('.icon-volume');
46 button.on('click', function () {
47 let target = $(this).attr('id');
48 $('[data-popup=' + target).addClass('is-open');
49 $('body').addClass('popup-open');
52 closeButton.on('click', function() {
53 $(this).closest('.c-media__popup').removeClass('is-open');
54 $('body').removeClass('popup-open');
57 popupLayer.on('click', function(e) {
59 if($(e.target).is(popupLayer)) {
60 _this.removeClass('is-open');
61 $('body').removeClass('popup-open');
65 chaptersButton.on('click', function() {
66 $(this).parent().toggleClass('is-active');
69 select.on('click', function() {
70 $(this).toggleClass('is-active');
73 selectItem.on('click', function() {
74 selectItem.removeClass('is-active');
75 $(this).addClass('is-active');
78 $(document).keyup(function(e) {
79 if (e.keyCode === 27) {
80 $('.c-media__popup').removeClass('is-open');
85 // Homepage books sliders
87 let shelfSlider = $('.l-your-books__shelf .l-books');
88 let shelfNextSlide = $('.l-your-books__shelf .js-next-slide');
89 let shelfPrevSlide = $('.l-your-books__shelf .js-prev-slide');
90 let shelfCollapse = $('.l-your-books__shelf .js-collapse');
110 shelfNextSlide.on('click', function (event) {
111 event.preventDefault();
112 shelfSlider.slick('slickNext');
115 shelfPrevSlide.on('click', function (event) {
116 event.preventDefault();
117 shelfSlider.slick('slickPrev');
120 shelfCollapse.on('click', function (event) {
121 event.preventDefault();
122 shelfSlider.slick('slickPrev');
126 $('.js-collections').each(function() {
128 let collectionsSlider = $('.l-books', this);
129 if (collectionsSlider.children().length < 2) return;
132 collectionsSlider.css('display', 'block');
134 let collectionsNextSlide = $('.js-next-slide', this);
135 let collectionsPrevSlide = $('.js-prev-slide', this);
137 collectionsSlider.slick({
138 //prevArrow, nextArrow,
152 breakpoint: 360 - .01,
158 breakpoint: 520 - .01,
164 breakpoint: 680 - .01,
170 breakpoint: 840 - .01,
176 breakpoint: 1172 - .01,
185 collectionsNextSlide.on('click', function (event) {
186 event.preventDefault();
187 collectionsSlider.slick('slickNext');
190 collectionsPrevSlide.on('click', function (event) {
191 event.preventDefault();
192 collectionsSlider.slick('slickPrev');
195 let newBooksSlider = $('.js-new-books-slider .l-books');
196 let newBooksNextSlide = $('.js-new-books-slider .js-next-slide');
197 let newBooksPrevSlide = $('.js-new-books-slider .js-prev-slide');
199 newBooksSlider.slick({
217 newBooksNextSlide.on('click', function (event) {
218 event.preventDefault();
219 newBooksSlider.slick('slickNext');
222 newBooksPrevSlide.on('click', function (event) {
223 event.preventDefault();
224 newBooksSlider.slick('slickPrev');
230 let slider = $('.l-author__quotes__slider');
243 let sliderHomepage = $('.l-quotes');
244 sliderHomepage.slick({
261 let slider = $('.p-homepage__info__box--carousel');
279 // Text overlay toggler
281 let overlays = $('.l-article__overlay');
282 let button = $('.l-article__read-more');
284 overlays.each(function () {
285 let maxHeight = $(this).attr('data-max-height');
286 if($(this).outerHeight() > maxHeight) {
287 $(this).css({'maxHeight': maxHeight+'px'}).addClass('is-active');
289 $(this).next('.l-article__read-more').hide();
293 button.on('click', function() {
294 let dataLabel = $(this).attr('data-label');
295 let dataAction = $(this).attr('data-action');
296 $(this).parent().parent().find('.l-article__overlay').toggleClass('is-clicked');
297 if($(this).text() === dataLabel) {
298 $(this).text(dataAction);
300 $(this).text(dataLabel);
306 $('.l-checkout__payments__box button').on('click', function() {
307 let container = $(this).closest('.l-checkout__payments');
308 $('input', container).val($(this).val());
309 $('.is-active', container).removeClass('is-active');
310 $(this).closest('.l-checkout__payments__box').addClass('is-active');
311 $('#id_custom_amount').val('');
314 $('#id_custom_amount').on('input', function() {
315 if ($(this).val() > 0) {
316 $('.l-checkout__payments__box.is-active').removeClass('is-active');
318 $('.l-checkout__payments__box.initial-active').addClass('is-active');
322 $('.donation-mod-monthly').on('click', function() {
326 csrfmiddlewaretoken: $("[name=csrfmiddlewaretoken]").val(),
327 monthly: $(this).data('monthly'),
329 url: $(this).data('url'),
330 success: function(data) {
331 if ($(".q-reload-is-monthly").length) {
332 window.location.reload()
334 $(".q-is-monthly").toggleClass('is-monthly', data.monthly);
346 let $copy = $('.js-copy');
348 $copy.on('click', function() {
349 let $copyText = $(this).closest('.l-checkout__info__item').find('input');
351 document.execCommand('copy');
361 $(".icon-like").each(
363 ids.add($(e).attr('data-book'));
366 ids = [...ids].join(',');
372 $(document).on('click', '.icon-like', function(e) {
374 let liked = $(this).hasClass('icon-liked');
378 url: '/ludzie/lektura/' + $(this).attr('data-book-slug') + '/nie_lubie/',
379 data: {'csrfmiddlewaretoken': $('[name=csrfmiddlewaretoken]').val()},
381 success: function() {
382 delete state.liked[$btn.attr('data-book')];
386 window.location.href = $('#login-link').attr('href');
391 url: '/ludzie/lektura/' + $(this).attr('data-book-slug') + '/lubie/',
392 data: {'csrfmiddlewaretoken': $('[name=csrfmiddlewaretoken]').val()},
394 success: function() {
395 state.liked[$btn.attr('data-book')] = [{'favorites': true}];
399 window.location.href = $('#login-link').attr('href')
405 // TODO: DYNAMICALLY ADD
406 $(".add-set-tag input[name=name]").autocomplete({
407 source: '/ludzie/moje-tagi/',
408 }).on('autocompleteopen', function() {
409 $(this).closest('article').addClass('ac-hover');
410 }).on('autocompleteclose', function() {
411 $(this).closest('article').removeClass('ac-hover');
413 $(".add-set-tag").on("submit", function(e) {
417 url: $form.attr("action"),
418 data: $form.serialize(),
420 updateFromData(data);
422 $('input[name=name]', $form).val('');
427 $(document).on("click", ".sets .close", function() {
428 let bookId = $(this).closest("[data-book]").attr('data-book');
430 url: '/ludzie/usun-tag/',
432 csrfmiddlewaretoken: $("[name=csrfmiddlewaretoken]").val(),
434 slug: $(this).parent().attr('data-set'),
437 updateFromData(data);
444 function refreshAll(ids) {
445 $.ajax('/ludzie/ulubione/?ids=' + ids, {
446 success: function(result) {
447 updateFromData(result);
453 $.refreshLikes = refreshAll;
455 function updateFromData(data) {
457 if (data[pk] === null) {
458 delete state.liked[pk];
460 state.liked[pk] = data[pk];
465 function updateLikedAll() {
466 $(".icon-like").each(
473 function updateLiked(e) {
474 let bookId = $(e).attr('data-book');
477 let $bookContainer = $('.book-container-' + bookId);
478 let $sets = $(".sets", $bookContainer);
480 $.each(state.liked[bookId], (i,e) => {
484 let $set = $("<span>");
485 $set.attr("data-set", e.slug);
486 let $setA = $("<a>").appendTo($set);
487 $setA.attr("href", e.url);
489 let $setX = $("<a class='close'></a>").appendTo($set);
494 $(e).toggleClass('icon-liked', liked);
495 $bookContainer.toggleClass('book-liked', liked);
502 // Toggle a class on long press.
507 $("[data-longpress]").on("touchstart", (e) => {
508 $e = $(e.currentTarget);
509 timer = setTimeout(() => {
510 $e.toggleClass($e.attr('data-longpress'));
514 $("[data-longpress]").on("touchend", () => {
521 // Update search form filters.
523 $('.j-form-auto').each(function() {
525 $('input', $form).change(function() {$form.submit()});
526 $('select', $form).change(function() {$form.submit()});
527 $('textarea', $form).change(function() {$form.submit()});
532 $(".experiment input").on('change', function() {
533 let name = $(this).attr('name');
534 let val = $(this).val();
535 document.cookie = 'EXPERIMENT_' + name + '=' + val + '; path=/; max-age=31536000';
536 window.location.reload(true);
540 $(".c-media__settings > i").on('click', function() {
541 $(".c-media__settings").toggleClass('active');
544 $(".annoy-banner-clickable").each(function() {
545 let btn = $("a.action", this)[0];
546 $(this).click((e) => {
547 if (e.target !== btn) {