175
{{ define "index" }}
<!DOCTYPE html>
<html lang="en">
<head>
{{ template "head" . }}
<title>{{ .Path }}</title>
<script>
function fileExt(url) {
let i = url.toString().toLowerCase().lastIndexOf(".");
if (i === -1) {
return "";
}
return url.toString().toLowerCase().substring(url.toString().lastIndexOf("."));
}
const imgExts = [".jpg", ".jpeg", ".png", ".gif", ".webp", ".mp4"];
var dirPath = "{{ .Path }}";
if (!dirPath.endsWith("/")) {
dirPath += "/";
}
function IconCheck(elem) {
let icon = elem.querySelector(".icon");
let url = elem.querySelector(".file-name").innerText;
let ext = fileExt(url);
if (imgExts.includes(ext)) {
let mod = elem.querySelector(".mod-time").value.replaceAll(" ", "_").replaceAll(":", "_");
url = dirPath + url;
icon.innerHTML = "<img src='"+url+".png?icon=" + url + "&mod="+ mod +"' alt='a'/>";
}
}
function ZeroPad(num, size) {
num = num.toString();
for (let l = num.length;l < size;l++)num = "0" + num.toString();
return num;
}
function reverseList(list){
let c = list.childElementCount;
for (i = 1; i < c;i++){
list.insertBefore(list.children[i],list.firstChild);
}
Reversed = true;
}
function AlphabetSort(list) {
let i, switching, b, shouldSwitch;
switching = true;
while (switching) {
switching = false;
b = list.children;
for (i = 0; i < (b.length - 1); i++) {
shouldSwitch = false;
if (b[i].id.toLowerCase() > b[i + 1].id.toLowerCase()) {
shouldSwitch = true;
break;
}
}
if (shouldSwitch) {
b[i].parentNode.insertBefore(b[i + 1], b[i]);
switching = true;
}
}
Reversed = false;
currentSort = "AlphabetSort";
}
function ModSizeSort(list,size=false){
let classs = ".mod-time";
if (size===true)classs=".size";
let arr =new Array(...list.children);
arr.sort((b,a)=>(a.querySelector(classs).value)-(b.querySelector(classs).value));
arr.forEach(e=>e.parentNode.appendChild(e));
Reversed = false;
}
function ModSort(list){
ModSizeSort(list,false);
currentSort = "ModSort";
}
function SizeSort(list){
ModSizeSort(list,true);
currentSort = "SizeSort";
}
var currentSort = "ModSort";
var Reversed = false;
function Id2Fn(id){
let fn = {
AlphabetSort: AlphabetSort,
ModSort: ModSort,
SizeSort: SizeSort,
}[id];
if (currentSort === id && !Reversed) {
return function (list){fn(list);reverseList(list);}
}
else {
return function (list){fn(list);};
}
}
function SortWith(elem) {
let fn = Id2Fn(elem.id);
document.querySelectorAll(".dirs,.files").forEach(e =>fn(e));
if (Reversed) elem.parentElement.classList.add("rev");
else elem.parentElement.classList.remove("rev");
document.querySelectorAll(".CurSort").forEach(e => e.classList.remove("CurSort"));
elem.classList.add("CurSort");
localStorage.setItem("sort", currentSort);
localStorage.setItem("reversed", Reversed.toString());
}
document.addEventListener("DOMContentLoaded", function() {
document.querySelectorAll(".files > .filelabel").forEach(filelement =>IconCheck(filelement));
document.querySelectorAll(".timestr").forEach(elem => {
// let t= new Date(Date.parse("15 Mar 2025 15:23 +0000"))
let t =new Date(Date.parse(elem.title));
if (elem.innerText[0] >= '0' && elem.innerText[0] <= '9') {
elem.innerText = t.getFullYear()+"-"+ZeroPad((t.getMonth()+1),2)+"-"+ZeroPad(t.getDate(),2);
} else {
elem.innerText = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"][t.getDay()] + ", " + ZeroPad(t.getHours(),2) + ":" + ZeroPad(t.getMinutes(),2);
}
});
currentSort = localStorage.getItem("sort");
if (currentSort === null) {
currentSort = "ModSort";
}
Reversed = localStorage.getItem("reversed") !== "true";
if (currentSort==="ModSort"&&Reversed)return;
SortWith(document.getElementById(currentSort));
});
</script>
</head>
<body>
{{ if .Path }}
<header>
{{ if eq .Path "/" }}
{{ else }}
<a href=".." class="button">
<span class="icon"><</span><span>Back</span>
</a>
{{ end }}
<h1>Index of: {{ .Path }}</h1>
</header>
<div class="filelabel">
<span class="icon">l</span>
<span id="AlphabetSort" onclick="SortWith(this)" class="sorter">Name</span>
<span id="SizeSort" onclick="SortWith(this)" class="right sorter">Size</span>
<span id="ModSort" onclick="SortWith(this)" class="right CurSort sorter">Time Modified</span>
</div>
<br>
<div class="trees dirs">
{{ range .Dirs }}
{{ template "filelabel" . }}
{{ end }}
</div>
<div class="trees files">
{{ range .Items }}
{{ template "filelabel" . }}
{{ end }}
</div>
{{ else }}
{{ if .Error }}
<h1>{{ .Error }}</h1>
{{ else }}
{{ if .Upload }}
<h1>Upload</h1>
<form class="trees" enctype="multipart/form-data" action="{{ .Upload }}" method="post">
<div class="filelabel"><span>Path:</span><input type="text" name="path" /></div>
<div class="filelabel"><span>File:</span><input type="file" name="myFile" /></div>
<div class="filelabel"><span>Username:</span><input type="text" name="username" /></div>
<div class="filelabel"><span>Password:</span><input type="password" name="password" /></div>
<div class="filelabel"><span>OTP:</span><input type="text" name="otp" /></div>
<div class="filelabel"><span></span><input type="submit" value="Upload" /></div>
</form>
{{ end }}
{{ end }}
{{ end }}
</body>
</html>
{{ end }}