window.mdlio = { outlayer: function(outlayer) { this.outlayers = []; if (outlayer) { if (Array.isArray(outlayer)) { for (var e of outlayer) { this.outlayers.push(e); } } else { this.outlayers.push(outlayer); } } this.add = function(outlayer) { this.outlayers.push(outlayer); } ; this.appended = function(items) { mdlio.upgrade.appended(items); for (outlayer of this.outlayers) { outlayer.appended(items); } }; }, cards: { upgrade: function(element) { element.querySelectorAll(".mdl-card").forEach(mdlio.cards.upgradeCard) }, upgradeCard: function(card) { console.log(card); if(card.querySelector(".mdl-card_title")) { card.classList.add("has-title"); } if(card.querySelector(".mdl-card__actions")) { card.classList.add("has-actions"); } const parent=card.parentNode; const as=card.querySelector(".action.select"); /*if(parent.matches(".card-wrapper") && as) { parent.appendChild(as); }*/ card.classList.remove("upgradeable"); card.classList.add("upgraded"); }, }, lightbox: function(grid, selector, options) { var pswpElement = document.querySelectorAll('.pswp')[0]; if (pswpElement == null ) { pswpElement = mdlio.addPSWP(); } /*this.box = $(grid).find(selector).simpleLightbox(options); */ var items = []; this.items = items; const linkClicked = function(e) { console.log(this, this.lboxId); e.preventDefault(); var options = { index: this.lboxId }; var gallery = new PhotoSwipe(pswpElement,PhotoSwipeUI_Default,items,options); gallery.init(); }; this.appended = function(appendedItems) { //this.box.destroy(); for (var item of appendedItems) { var link = item.querySelector(selector); if (link == null ) { continue; } var img = link.querySelector('img'); var width = img.naturalWidth; var height = img.naturalHeight; var maybeSize = link.getAttribute('data-img-size'); if (maybeSize) { console.log(maybeSize); [ width , height ] = maybeSize.split('x').map(function(x) { return Number.parseInt(x); }); } var slide = { msrc: img.getAttribute('src'), src: link.getAttribute('href'), w: width, h: height }; console.log(slide); var slideId = items.push(slide) - 1; var links = item.querySelectorAll(selector); for (link of links) { if (link.getAttribute('href') == slide.src) { link.lboxId = slideId; link.addEventListener("click", linkClicked); } } } //this.box = $(grid).find(selector).simpleLightbox(options); } }, infiniteScroll: function(grid, item, nextPage, outlayer) { var outlayers = new mdlio.outlayer(outlayer); var infScroll = new InfiniteScroll(grid,{ path: nextPage, hideNav: nextPage, append: item, outlayer: outlayers, status: '.page-load-status', scrollThresold: 100, prefill: true //elementScroll: '.mdl-layout__content', }); infScroll.outlayers = outlayers; return infScroll; }, cardsGallery: function(grid, item, lightboxItem) { const lightbox = new mdlio.lightbox(grid,lightboxItem + " a"); const msnry = new Masonry(grid,{ itemSelector: 'none', // select none at first columnWidth: document.querySelector('#gutter'), gutter: 0, containerStyle: { width: 'calc(100% - 16px)', padding: '0px', position: 'relative' }, percentPosition: true, // nicer reveal transition visibleStyle: { transform: 'translateY(0)', opacity: 1 }, hiddenStyle: { transform: 'translateY(100px)', opacity: 0 }, }); this.lightbox = lightbox; this.masonry = msnry; imagesLoaded(grid, function() { grid.classList.remove('are-images-unloaded'); msnry.options.itemSelector = item; var items = grid.querySelectorAll(item); lightbox.appended(items); msnry.appended(items); }); if (document.querySelector(".next-page")) { this.infiniteScroll = new mdlio.infiniteScroll(grid,item,'.next-page',[msnry, this.lightbox]); } }, addPSWP: function() { var body = document.querySelector('body'); var pswp = document.createElement('div'); pswp.classList.add('pswp'); pswp.innerHTML = `
` body.appendChild(pswp); return pswp; }, forms: { upgrade: function(element) { element.querySelectorAll('form .async[type="submit"]').forEach(function(button) { button.addEventListener("click", function(e) { e.preventDefault(); const form = button.findParentBySelector("form"); $.ajax({ type: "POST", cache: false, url: form.action, data: $(form).serialize(), success: function(msg) { console.log("Success", msg); } }); }); }); } }, upgrade: { initial: function() { mdlio.upgrade.appended([document.querySelector("body")]); }, appended: function(items) { items.forEach(mdlio.upgrade.upgrade); }, upgrade: function(item) { for(const upgrader of mdlio.upgrade.upgraders) { upgrader.upgrade(item); } }, upgraders: [], }, selectable: new (function(){ this.availableActions = new Set(); const selected = new Set(); this.selected = selected; const actionButtons = {}; this.displayToolbar = function() { var toolbar; if(!this.toolbar) { toolbar = document.createElement("div"); toolbar.classList.add("selection-bar"); toolbar.classList.add("mdl-layout__header"); toolbar.classList.add("mdl-color--white"); const header = document.querySelector("header.mdl-layout__header"); toolbar.innerHTML=`
0 Selected
`; header.parentNode.appendChild(toolbar); toolbar.querySelector("button.cancel").addEventListener("click",this.stopSelection); this.toolbar = { toolbar: toolbar, counter: toolbar.querySelector(".mdl-layout_title span"), actions: toolbar.querySelector(".actions") }; } toolbar = this.toolbar; toolbar.counter.innerHTML = this.selected.size }; this.addToolbarAction = function(action) { this.availableActions.add(action); var button = actionButtons[action]; if(!button) { button = document.createElement("div"); button.innerHTML='' button.classList.add("mdl-button"); button.classList.add("mdl-button--icon"); button.addEventListener("click", this.actionClickHandler); button.dataset.action = action; actionButtons[action] = button; } this.toolbar.actions.appendChild(button); }; this.removeToolbarAction = function(action) { this.availableActions.delete(action); var button = actionButtons[action]; if (button) { this.toolbar.actions.removeChild(button) } } this.startSelection = function() { this.displayToolbar(); document.querySelector("body").classList.add("selection-mode"); } this.stopSelection = function() { document.querySelector("body").classList.remove("selection-mode"); for (item of mdlio.selectable.selected) { mdlio.selectable.unselect(item); } } this.select = function(item) { item.classList.add("selected"); this.selected.add(item); this.startSelection(); var actions = item.querySelectorAll("[data-selectable-action]"); var actionsSet = new Set(); for (const action of actions) { actionsSet.add(action.dataset.selectableAction); } console.log("actions", this.availableActions); if(this.selected.size == 1) { for(action of actionsSet) { this.addToolbarAction(action); } } else { for (const action of this.availableActions) { if(!actionsSet.has(action)) { this.removeToolbarAction(action); } } } }; this.unselect = function(item) { item.classList.remove("selected"); this.selected.delete(item); if(mdlio.selectable.selected.size == 0) { this.stopSelection(); } }; const actionsHandlers = {} this.action = function(key, fn) { actionsHandlers[key] = function(items) {items.forEach(fn)}; }; this.batchAction = function(key, fn) { actionsHandlers[key] = fn; }; this.actionClickHandler = function(ev) { var action = this.dataset.action; console.log("Invoking action", action, ev); var handler = actionsHandlers[action]; if(handler) { handler(Array.from(selected)); } } this.upgrade = function(item) { var items=[]; if (item.matches(".selectable")) { items=[item]; } else { items=item.querySelectorAll(".selectable") } items.forEach(function(item) { var selectButton = item.querySelector('.action.select'); if(!selectButton) { selectButton = document.createElement("button"); selectButton.classList.add("mdl-button","mdl-button--icon"); selectButton.classList.add("action","select"); selectButton.innerHTML='check'; item.appendChild(selectButton); } selectButton.addEventListener("click", function(e) { e.preventDefault(); if(item.classList.contains("selected")) { mdlio.selectable.unselect(item); } else { mdlio.selectable.select(item); } }); }) }; })() }; mdlio.upgrade.upgraders.push(mdlio.cards); mdlio.upgrade.upgraders.push(mdlio.forms); mdlio.upgrade.upgraders.push(mdlio.selectable); Element.prototype.findParentBySelector = function(selector) { console.log(this); var cur = this.parentNode; while (cur && !cur.matches(selector)) { //keep going up until you find a match cur = cur.parentNode; //go up } return cur; //will return null if not found } , window.addEventListener('load', function() { mdlio.upgrade.initial(); }); window.addEventListener('load', function() { console.log("Content-loaded"); });