Files
Photography/assets/js/main.min.js
Kroonk 75a5a596c5 Fix Selection-Toolbar: Position oben statt ueber Header, direktes Button-Binding
Toolbar wird jetzt am oberen Bildschirmrand angezeigt (Desktop),
damit sie nicht mehr den Header/Nav ueberlagert. Auf Mobile
bleibt sie unterhalb des Headers. Cancel/Download-Buttons nutzen
direktes Binding auf $toolbar statt Delegation auf document.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 23:29:28 +02:00

1 line
9.3 KiB
JavaScript

!function(e){var n,o=e(window),a=e("body");e("#wrapper");(breakpoints({xlarge:["1281px","1680px"],large:["981px","1280px"],medium:["737px","980px"],small:["481px","736px"],xsmall:[null,"480px"]}),"ie"==browser.name&&a.addClass("ie"),browser.mobile&&a.addClass("touch"),browser.canUse("transition"))&&(o.on("load",function(){window.setTimeout(function(){a.removeClass("is-preload")},100)}),o.on("resize",function(){window.clearTimeout(n),a.addClass("is-resizing"),n=window.setTimeout(function(){a.removeClass("is-resizing")},100)}));o.scrollTop(0);var t=e(".panel");t.each(function(){var n=e(this),o=e('[href="#'+n.attr("id")+'"]');e('<div class="closer" />').appendTo(n).on("click",function(e){n.trigger("---hide")}),n.on("click",function(e){e.stopPropagation()}).on("---toggle",function(){n.hasClass("active")?n.triggerHandler("---hide"):n.triggerHandler("---show")}).on("---show",function(){a.hasClass("content-active")&&t.trigger("---hide"),n.addClass("active"),o.addClass("active"),a.addClass("content-active")}).on("---hide",function(){n.removeClass("active"),o.removeClass("active"),a.removeClass("content-active")}),o.removeAttr("href").css("cursor","pointer").on("click",function(e){e.preventDefault(),e.stopPropagation(),n.trigger("---toggle")})}),a.on("click",function(e){a.hasClass("content-active")&&(e.preventDefault(),e.stopPropagation(),t.trigger("---hide"))}),o.on("keyup",function(e){27==e.keyCode&&a.hasClass("content-active")&&(e.preventDefault(),e.stopPropagation(),t.trigger("---hide"))}),e("#header").find("a").each(function(){var n=e(this),o=n.attr("href");o&&"#"!=o.charAt(0)&&n.removeAttr("href").css("cursor","pointer").on("click",function(e){e.preventDefault(),e.stopPropagation(),window.location.href=o})}),e("#footer").find(".copyright").each(function(){var n=e(this),o=n.parent(),a=o.parent().children().last();breakpoints.on("<=medium",function(){n.appendTo(a)}),breakpoints.on(">medium",function(){n.appendTo(o)})});var i=e("#main"),l={},r=["jpg","jpeg","png","gif","webp"];function s(n){var o=e("#main").data("exif"),a="";for(var t in o){var i=o[t],l=EXIF.getTag(n,i.tag);void 0!==l&&(a+='<i class="'+i.icon+'" aria-hidden="true"></i> '+l+"&nbsp;&nbsp;")}return a}e.ajax({url:"/images/fulls/",dataType:"json",cache:!1,success:function(n){if(0!==n.length){var o=n.filter(function(e){if("file"!==e.type)return!1;var n=e.name.split(".").pop().toLowerCase();return-1!==r.indexOf(n)});0!==o.length?(o.sort(function(e,n){return e.name.localeCompare(n.name)}),o.forEach(function(n){var o=e('<article class="thumb"></article>'),a=n.folder?encodeURIComponent(n.folder)+"/":"",t="/images/fulls/"+a+encodeURIComponent(n.name),l="/images/thumbs/"+a+encodeURIComponent(n.name),r=e('<a class="image" href="'+t+'"></a>'),s=e('<img src="'+l+'" alt="" data-name="'+n.name.replace(/"/g,"&quot;")+'" />');r.append(s),o.append(r),i.append(o)}),i.children(".thumb").each(function(){var n,o=e(this),a=o.find(".image"),t=a.children("img");0!=a.length&&(a.css("background-image","url('"+t.attr("src")+"')"),(n=t.data("position"))&&a.css("background-position",n),t.hide(),t[0].addEventListener("error",function(){var e=a.attr("href");e&&a.css("background-image","url('"+e+"')")}),t[0].addEventListener("load",function(){EXIF.getData(t[0],function(){l[t.data("name")]=s(this)})}))}),function(n){var o=[],a=!1,t=e('<div id="selection-toolbar"></div>');t.html('<span id="sel-count">0 ausgewaehlt</span><button id="sel-download" class="button small" disabled><i class="fa fa-download"></i> Herunterladen</button><button id="sel-cancel" class="button small"><i class="fa fa-times"></i> Abbrechen</button>'),e("body").append(t);var l=e('<li><a href="#" id="select-mode-toggle" title="Bilder auswaehlen"><i class="fa fa-check-square"></i></a></li>');e("#header nav > ul").prepend(l);var r=[];function s(){var n=o.length;e("#sel-count").text(n+" ausgewaehlt"),e("#sel-download").prop("disabled",0===n),n>3?e("#sel-download").html('<i class="fa fa-file-archive-o"></i> Als ZIP ('+n+")"):n>0?e("#sel-download").html('<i class="fa fa-download"></i> Herunterladen ('+n+")"):e("#sel-download").html('<i class="fa fa-download"></i> Herunterladen')}function d(){o=[],e(".thumb").removeClass("selected"),s()}n.forEach(function(e){e.folder&&-1===r.indexOf(e.folder)&&r.push(e.folder)}),r.length>0&&r.forEach(function(n){var o=e('<li><a href="#" class="folder-download-btn" data-folder="'+n+'" title="Ordner \''+n+'\' herunterladen"><i class="fa fa-folder-open"></i></a></li>');e("#header nav > ul").prepend(o)}),e(document).on("click","#select-mode-toggle",function(n){n.preventDefault(),n.stopPropagation(),a=!a,e("body").toggleClass("selection-mode",a),a||d(),t.toggleClass("visible",a)}),i.find(".thumb a.image").on("click",function(n){if(a){n.preventDefault(),n.stopImmediatePropagation();var t=e(this).closest(".thumb"),i=t.find("img"),l=i.data("name"),r=e(this).attr("href"),d=null,c=r.replace("/images/fulls/",""),p=c.split("/");p.length>1&&(d=decodeURIComponent(p[0]));for(var u=-1,f=0;f<o.length;f++)if(o[f].name===l&&o[f].folder===d){u=f;break}-1!==u?(o.splice(u,1),t.removeClass("selected")):(o.push({name:l,folder:d}),t.addClass("selected")),s()}}),t.on("click","#sel-download",function(){0!==o.length&&e.ajax({url:"/api/download/selected",type:"POST",contentType:"application/json",data:JSON.stringify({images:o}),xhrFields:{responseType:"blob"},success:function(e,n,o){var a=o.getResponseHeader("Content-Type");if(a&&-1!==a.indexOf("application/json")){var t=new FileReader;t.onload=function(){var e=JSON.parse(this.result);"individual"===e.mode&&e.urls.forEach(function(e,n){setTimeout(function(){var n=document.createElement("a");n.href=e,n.download="",document.body.appendChild(n),n.click(),document.body.removeChild(n)},300*n)})},t.readAsText(e)}else{var i=window.URL.createObjectURL(e),l=document.createElement("a");l.href=i,l.download="mischkomposition-auswahl.zip",document.body.appendChild(l),l.click(),window.URL.revokeObjectURL(i),document.body.removeChild(l)}},error:function(e){alert(e.responseJSON?e.responseJSON.error:"Download fehlgeschlagen")}})}),t.on("click","#sel-cancel",function(){a=!1,e("body").removeClass("selection-mode"),t.removeClass("visible"),d()}),e(document).on("click",".folder-download-btn",function(n){n.preventDefault(),n.stopPropagation();var o=e(this).data("folder"),a=document.createElement("a");a.href="/api/download/folder/"+encodeURIComponent(o),a.download=o+".zip",document.body.appendChild(a),a.click(),document.body.removeChild(a)})}(o),i.poptrox({baseZIndex:2e4,caption:function(e){var n=e.children("img"),o=l[n.data("name")];void 0===o&&EXIF.getData(n[0],function(){o=l[n.data("name")]=s(this)});var a='<br/><a href="'+e.attr("href")+'" download="'+n.data("name")+'" class="button small" style="margin-top:10px;">Bild Speichern <i class="fa fa-download"></i></a>';return void 0!==o?"<p>"+o+a+"</p>":"<p>"+a+"</p>"},fadeSpeed:300,onPopupClose:function(){a.removeClass("modal-active")},onPopupOpen:function(){a.addClass("modal-active")},overlayOpacity:0,popupCloserText:"",popupHeight:150,popupLoaderText:"",popupSpeed:300,popupWidth:150,selector:".thumb > a.image",usePopupCaption:!0,usePopupCloser:!0,usePopupDefaultStyling:!1,usePopupForceClose:!0,usePopupLoader:!0,usePopupNav:!0,windowMargin:50}),breakpoints.on("<=xsmall",function(){i[0]._poptrox.windowMargin=0}),breakpoints.on(">xsmall",function(){i[0]._poptrox.windowMargin=50})):i.html('<p style="text-align:center;color:#fff;padding:2em;width:100%">Es wurden noch keine passenden Bilder für diesen Account hochgeladen oder zugewiesen.</p>')}else i.html('<p style="text-align:center;color:#fff;padding:2em;width:100%">Noch keine Bilder vorhanden.</p>')},error:function(){i.html('<p style="text-align:center;color:#fff;padding:2em;">Keine Bilder gefunden. Lade Bilder in deinen Nextcloud-Ordner hoch.</p>')}});var d=localStorage.getItem("mischkomposition_theme")||"main";function c(n){"light"===n?e("#theme-toggle i").removeClass("fa-sun").addClass("fa-moon"):e("#theme-toggle i").removeClass("fa-moon").addClass("fa-sun")}c(d),e("#theme-toggle").click(function(n){n.preventDefault(),d="main"===d?"light":"main",localStorage.setItem("mischkomposition_theme",d),e("#theme-style").attr("href","assets/css/"+d+".min.css"),c(d)}),e.get("/api/auth/me").done(function(n){e("#login-username, #login-password, #login-submit").hide(),e("#logout-btn").show().css("display","inline-block"),e("#pw-change-section").show(),"admin"===n.role&&e("#admin-link").html('<a href="/admin.html" class="button">Admin-Dashboard</a>'),e("#login-nav").html('Account <i class="fa fa-user"></i>')}),e("#login-form").submit(function(n){n.preventDefault(),e.post("/api/auth/login",{username:e("#login-username").val(),password:e("#login-password").val()}).done(function(){window.location.reload()}).fail(function(e){var n="Login fehlgeschlagen.";e.responseJSON&&"Account abgelaufen"===e.responseJSON.error&&(n="Dein Account ist abgelaufen. Bitte kontaktiere den Administrator."),alert(n)})}),e("#logout-btn").click(function(n){n.preventDefault(),e.post("/api/auth/logout").done(function(){window.location.reload()})}),e("#pw-change-form").submit(function(n){n.preventDefault();var o=e("#pw-new").val();o===e("#pw-confirm").val()?e.post("/api/auth/change-password",{old_password:e("#pw-old").val(),new_password:o}).done(function(){alert("Passwort geaendert!"),e("#pw-old, #pw-new, #pw-confirm").val("")}).fail(function(e){alert(e.responseJSON?e.responseJSON.error:"Fehler")}):alert("Passwoerter stimmen nicht ueberein.")})}(jQuery);