diff --git a/src/_h5ai/private/conf/l10n/af.json b/src/_h5ai/private/conf/l10n/af.json index 5150c7ba..be101f8b 100644 --- a/src/_h5ai/private/conf/l10n/af.json +++ b/src/_h5ai/private/conf/l10n/af.json @@ -3,6 +3,7 @@ "dateFormat": "YYYY-MM-DD HH:mm", "details": "besonderhede", + "displayAll": "Vertoon alles", "download": "aflaai", "empty": "leeg", "files": "lêers", @@ -10,9 +11,18 @@ "folders": "gidse", "grid": "rooster", "icons": "ikone", + "info": "Inligting", + "language": "Taal", "lastModified": "Laas verander", "name": "Naam", "noMatch": "geen resultaat", + "pagination": "Paginasie", + "pagInputBtn": "GO", + "pagInputTxt": "bladsy", "parentDirectory": "Hoër Vlak", - "size": "Grootte" + "perPage": "### per bladsy", + "search": "soek", + "size": "Grootte", + "tree": "boom", + "view": "geaardheid" } diff --git a/src/_h5ai/private/conf/l10n/bg.json b/src/_h5ai/private/conf/l10n/bg.json index 6808e627..337aea90 100644 --- a/src/_h5ai/private/conf/l10n/bg.json +++ b/src/_h5ai/private/conf/l10n/bg.json @@ -4,15 +4,25 @@ "dateFormat": "DD-MM-YYYY HH:mm", "details": "детайли", "download": "изтегляне", + "displayAll": "Показване на ВСИЧКИ", "empty": "празна", "files": "файлове", "filter": "филтър", "folders": "директории", "grid": "мрежа", "icons": "икони", + "info": "Информация", + "language": "език", "lastModified": "Последна промяна", "name": "Име", "noMatch": "няма съвпадение", + "pagination": "Пагинация", + "pagInputBtn": "ОТИВАМ", + "pagInputTxt": "страница", "parentDirectory": "Предходна директория", - "size": "Размер" + "perPage": "### на страница", + "search": "търсене", + "size": "Размер", + "tree": "Дърво", + "view": "Разпореждане" } diff --git a/src/_h5ai/private/conf/l10n/cs.json b/src/_h5ai/private/conf/l10n/cs.json index 1e34e619..9a5aa1e6 100644 --- a/src/_h5ai/private/conf/l10n/cs.json +++ b/src/_h5ai/private/conf/l10n/cs.json @@ -1,18 +1,28 @@ { "lang": "čeština", - "dateFormat": "DD.MM.YYYY HH:mm", + "DateFormat": "DD.MM.YYYY HH:mm", "details": "Podrobnosti", "download": "Stáhnout", + "displayAll": "Zobrazit VŠE", "empty": "Prázdná složka", "files": "souborů", "filter": "Filtr", "folders": "složek", "grid": "Seznam", "icons": "Velké ikony", + "info": "Informace", + "language": "Jazyk", "lastModified": "Datum změny", "name": "Název", "noMatch": "Žádná shoda", + "pagination": "Stránkování", + "pagInputBtn": "JÍT", + "pagInputTxt": "strana", "parentDirectory": "Nadřazený adresář", - "size": "Velikost" + "perPage": "### na stránku", + "search": "vyhledávání", + "size": "Velikost", + "tree": "Strom", + "view": "Dispozice" } diff --git a/src/_h5ai/private/conf/l10n/da.json b/src/_h5ai/private/conf/l10n/da.json index 3b8fa061..56dae61b 100644 --- a/src/_h5ai/private/conf/l10n/da.json +++ b/src/_h5ai/private/conf/l10n/da.json @@ -4,15 +4,25 @@ "dateFormat": "DD-MM-YYYY HH:mm", "details": "detaljer", "download": "download", + "displayAll": "Vis ALLE", "empty": "tom", "files": "filer", "filter": "filter", "folders": "mapper", "grid": "grid", "icons": "ikoner", + "info": "Oplysninger", + "language": "Sprog", "lastModified": "Sidst ændret", "name": "Navn", "noMatch": "ingen match", + "pagination": "Paginering", + "pagInputBtn": "GÅ", + "pagInputTxt": "side", "parentDirectory": "Overordnet mappe", - "size": "Størrelse" + "perPage": "### pr. Side", + "search": "søge", + "size": "Størrelse", + "tree": "Træ", + "view": "Disposition" } diff --git a/src/_h5ai/private/conf/l10n/de.json b/src/_h5ai/private/conf/l10n/de.json index 6d8c6134..ace57442 100644 --- a/src/_h5ai/private/conf/l10n/de.json +++ b/src/_h5ai/private/conf/l10n/de.json @@ -4,17 +4,23 @@ "dateFormat": "DD.MM.YYYY HH:mm", "details": "Details", "download": "Download", + "displayAll": "ALLE anzeigen", "empty": "leer", "files": "Dateien", "filter": "filtern", "folders": "Ordner", "grid": "Gitter", "icons": "Icons", + "info": "Informationen", "language": "Sprache", "lastModified": "Geändert", "name": "Name", "noMatch": "keine Treffer", + "pagination": "Seitennummerierung", + "pagInputBtn": "GEHEN", + "pagInputTxt": "Seite", "parentDirectory": "Übergeordnetes Verzeichnis", + "perPage": "### pro Seite", "search": "suchen", "size": "Größe", "tree": "Baum", diff --git a/src/_h5ai/private/conf/l10n/el.json b/src/_h5ai/private/conf/l10n/el.json index 2d9c00d9..3ce1f937 100644 --- a/src/_h5ai/private/conf/l10n/el.json +++ b/src/_h5ai/private/conf/l10n/el.json @@ -4,15 +4,25 @@ "dateFormat": "DD/MM/YYYY HH:mm", "details": "λεπτομέρειες", "download": "μεταμόρφωση", + "displayAll": "Εμφάνιση ΟΛΩΝ", "empty": "κενό", "files": "αρχεία", "filter": "φίλτρο", "folders": "φάκελοι", "grid": "πλέγμα", "icons": "εικονίδια", + "info": "Πληροφορίες", + "language": "Γλώσσα", "lastModified": "Τελευταία τροποποίηση", "name": "Όνομα", "noMatch": "κανένα αποτέλεσμα", + "pagination": "Σελιδοποίηση", + "pagInputBtn": "ΠΗΓΑΙΝΩ", + "pagInputTxt": "σελίδα", "parentDirectory": "Προηγούμενος Κατάλογος", - "size": "Μέγεθος" + "perPage": "### ανά σελίδα", + "search": "ψάχνω", + "size": "Μέγεθος", + "tree": "Δέντρο", + "view": "Διάθεση" } diff --git a/src/_h5ai/private/conf/l10n/en.json b/src/_h5ai/private/conf/l10n/en.json index 05e9b4eb..f754080b 100644 --- a/src/_h5ai/private/conf/l10n/en.json +++ b/src/_h5ai/private/conf/l10n/en.json @@ -5,17 +5,23 @@ "dateFormat": "YYYY-MM-DD HH:mm", "details": "details", "download": "download", + "displayAll": "Display ALL", "empty": "empty", "files": "files", "filter": "filter", "folders": "folders", "grid": "grid", "icons": "icons", + "info": "Informations", "language": "Language", "lastModified": "Last modified", "name": "Name", "noMatch": "no match", + "pagination": "Pagination", + "pagInputBtn": "GO", + "pagInputTxt": "page", "parentDirectory": "Parent Directory", + "perPage": "### per page", "search": "search", "size": "Size", "tree": "Tree", diff --git a/src/_h5ai/private/conf/l10n/es.json b/src/_h5ai/private/conf/l10n/es.json index e42a5b9d..95f2b0a5 100644 --- a/src/_h5ai/private/conf/l10n/es.json +++ b/src/_h5ai/private/conf/l10n/es.json @@ -4,19 +4,25 @@ "dateFormat": "DD/MM/YYYY HH:mm", "details": "Detalles", "download": "Descargar", + "displayAll": "Mostrar TODO", "empty": "vacío", "files": "Archivos", "filter": "Filtrar", "folders": "Directorios", "grid": "Cuadrícula", "icons": "Íconos", + "info": "Informaciones", "language": "Idioma", "lastModified": "Última modificación", "name": "Nombre", "noMatch": "Sin coincidencias", + "pagination": "Paginación", + "pagInputBtn": "ANDA", + "pagInputTxt": "página", "parentDirectory": "Directorio superior", + "perPage": "### por página", "search": "buscar", "size": "Tamaño", "tree": "Arbol", - "view": "Vista" + "view": "Disposición" } diff --git a/src/_h5ai/private/conf/l10n/et.json b/src/_h5ai/private/conf/l10n/et.json index 8f3d1dc4..9d7921ed 100644 --- a/src/_h5ai/private/conf/l10n/et.json +++ b/src/_h5ai/private/conf/l10n/et.json @@ -4,19 +4,25 @@ "dateFormat": "DD-MM-YYYY HH.mm", "details": "täpsem info", "download": "laadi alla", + "displayAll": "Kuva KÕIK", "empty": "tühi", "files": "failid", "filter": "filter", "folders": "kataloogid", "grid": "võre", "icons": "ikoonid", + "info": "Teave", "language": "Keel", "lastModified": "Viimati muudetud", "name": "Nimi", "noMatch": "ei leitud sobivat", + "pagination": "Lehekülgede otsimine", + "pagInputBtn": "SAADA", + "pagInputTxt": "lehele", "parentDirectory": "Emakataloog", + "perPage": "### lehe kohta", "search": "otsi", "size": "Suurus", "tree": "Puu", - "view": "Vaade" + "view": "Dispositsioon" } diff --git a/src/_h5ai/private/conf/l10n/fi.json b/src/_h5ai/private/conf/l10n/fi.json index c19c0ed3..14070bc4 100644 --- a/src/_h5ai/private/conf/l10n/fi.json +++ b/src/_h5ai/private/conf/l10n/fi.json @@ -4,15 +4,25 @@ "dateFormat": "DD.MM.YYYY HH:mm", "details": "tiedot", "download": "lataa", + "displayAll": "Näytä KAIKKI", "empty": "tyhjä", "files": "tiedostoa", "filter": "suodata", "folders": "hakemistoa", "grid": "ruudukko", "icons": "ikonit", + "info": "Tiedot", + "language": "Kieli", "lastModified": "Viimeksi muokattu", "name": "Nimi", "noMatch": "ei osumia", + "pagination": "Sivunumerointi", + "pagInputBtn": "MENNÄ", + "pagInputTxt": "sivu", "parentDirectory": "Ylähakemisto", - "size": "Koko" + "perPage": "### per sivu", + "search": "etsintä", + "size": "Koko", + "tree": "Puu", + "view": "Hävittäminen" } diff --git a/src/_h5ai/private/conf/l10n/fr.json b/src/_h5ai/private/conf/l10n/fr.json index 9a4ac458..7a580259 100644 --- a/src/_h5ai/private/conf/l10n/fr.json +++ b/src/_h5ai/private/conf/l10n/fr.json @@ -3,6 +3,7 @@ "dateFormat": "DD/MM/YYYY HH:mm", "details": "détails", + "displayAll": "Afficher tout", "download": "télécharger", "empty": "vide", "files": "Fichiers", @@ -10,11 +11,16 @@ "folders": "Répertoires", "grid": "grille", "icons": "icônes", + "info": "Informations", "language": "Langue", "lastModified": "Dernière modification", "name": "Nom", "noMatch": "rien trouvé", + "pagination": "Pagination", + "pagInputBtn": "GO", + "pagInputTxt": "page", "parentDirectory": "Dossier parent", + "perPage": "### par page", "search": "rechercher", "size": "Taille", "tree": "Arborescence", diff --git a/src/_h5ai/private/conf/l10n/he.json b/src/_h5ai/private/conf/l10n/he.json index bb37f7f7..d1502b36 100644 --- a/src/_h5ai/private/conf/l10n/he.json +++ b/src/_h5ai/private/conf/l10n/he.json @@ -4,14 +4,25 @@ "dateFormat": "DD.MM.YYYY HH:mm", "details": "פרטים", "download": "הורדה", + "displayAll": "הצג הכל", "empty": "ריק", "files": "קבצים", "filter": "סינון", "folders": "תיקיות", + "grid": "רֶשֶׁת", "icons": "צלמיות", + "info": "מידע", + "language": "שפה", "lastModified": "שינוי אחרון", "name": "שם", "noMatch": "אין תוצאות", + "pagination": "דִפּוּף", + "pagInputBtn": "ללכת", + "pagInputTxt": "עמוד", "parentDirectory": "תיקיית הורה", - "size": "גודל" + "perPage": "לעמוד ###", + "search": "לחפש", + "size": "גודל", + "tree": "עֵץ", + "view": "מֶזֶג" } diff --git a/src/_h5ai/private/conf/l10n/hi.json b/src/_h5ai/private/conf/l10n/hi.json index 5941733b..bfdd644d 100644 --- a/src/_h5ai/private/conf/l10n/hi.json +++ b/src/_h5ai/private/conf/l10n/hi.json @@ -4,15 +4,25 @@ "dateFormat": "DD.MM.YYYY HH:mm", "details": "विस्तार", "download": "डाउनलोड", + "displayAll": "सभी प्रदर्शित करें", "empty": "खाली", "files": "फ़ाइलें", "filter": "फ़िल्टर", "folders": "फोल्डर", "grid": "ग्रिड", "icons": "आइकॉन", + "info": "जानकारियां", + "language": "भाषा", "lastModified": "पिछला परिवर्तन", "name": "नाम", "noMatch": "कोई समानता नहीं", + "pagination": "पृष्ठ पर अंक लगाना", + "pagInputBtn": "जाओ", + "pagInputTxt": "पृष्ठ", "parentDirectory": "मूल डायरेक्टरी", - "size": "माप" + "perPage": "### प्रति पेज।", + "search": "खोज", + "size": "माप", + "tree": "पेड़", + "view": "स्वभाव" } diff --git a/src/_h5ai/private/conf/l10n/hr.json b/src/_h5ai/private/conf/l10n/hr.json index c044db4a..73f2070b 100644 --- a/src/_h5ai/private/conf/l10n/hr.json +++ b/src/_h5ai/private/conf/l10n/hr.json @@ -4,15 +4,25 @@ "dateFormat": "YYYY-MM-DD HH:mm", "details": "detalji", "download": "preuzmi", + "displayAll": "Prikaži SVE", "empty": "prazno", "files": "datoteka", "filter": "filter", "folders": "direktorij(a)", "grid": "mreža", "icons": "ikone", + "info": "Informacije", + "language": "Jezik", "lastModified": "Posljednja izmjena", "name": "Naziv", "noMatch": "nema rezultata", + "pagination": "Paginacija", + "pagInputBtn": "IĆI", + "pagInputTxt": "stranica", "parentDirectory": "Natrag", - "size": "Veličina" + "perPage": "### po stranici", + "search": "traženje", + "size": "Veličina", + "tree": "Drvorez", + "view": "Dispozicija" } diff --git a/src/_h5ai/private/conf/l10n/hu.json b/src/_h5ai/private/conf/l10n/hu.json index b2c1b34e..7d14ce6c 100644 --- a/src/_h5ai/private/conf/l10n/hu.json +++ b/src/_h5ai/private/conf/l10n/hu.json @@ -4,13 +4,25 @@ "dateFormat": "YYYY-MM-DD HH:mm", "details": "részletek", "download": "letöltés", + "displayAll": "Összes megjelenítése", "empty": "üres", "files": "fájlok", + "filter": "szűrő", "folders": "mappák", + "grid": "rács", "icons": "ikonok", + "info": "Információk", + "language": "Nyelv", "lastModified": "Utoljára módosítva", "name": "Név", "noMatch": "nincs találat", + "pagination": "Lapszámozás", + "pagInputBtn": "MEGY", + "pagInputTxt": "oldal", "parentDirectory": "Szülő könyvtár", - "size": "Méret" + "perPage": "### oldalanként", + "search": "keresés", + "size": "Méret", + "tree": "Fa szerkezete", + "view": "Diszpozíció" } diff --git a/src/_h5ai/private/conf/l10n/id.json b/src/_h5ai/private/conf/l10n/id.json index 1987f590..e0a04b23 100644 --- a/src/_h5ai/private/conf/l10n/id.json +++ b/src/_h5ai/private/conf/l10n/id.json @@ -4,17 +4,23 @@ "dateFormat": "DD-MM-YYYY HH:mm", "details": "rincian", "download": "unduh", + "displayAll": "Tampilkan SEMUA", "empty": "kosong", "files": "berkas", "filter": "saring", "folders": "pelipat", "grid": "jaring", "icons": "ikon", + "info": "Informasi", "language": "Bahasa", "lastModified": "Di modifikasi", "name": "Nama", "noMatch": "tidak cocok", + "pagination": "Penomoran halaman", + "pagInputBtn": "PERGI", + "pagInputTxt": "halaman", "parentDirectory": "Direktori induk", + "perPage": "### per halaman", "search": "cari", "size": "Ukuran", "tree": "Pohon", diff --git a/src/_h5ai/private/conf/l10n/it.json b/src/_h5ai/private/conf/l10n/it.json index 4547c62b..7eacf4d2 100644 --- a/src/_h5ai/private/conf/l10n/it.json +++ b/src/_h5ai/private/conf/l10n/it.json @@ -4,19 +4,25 @@ "dateFormat": "DD-MM-YYYY HH:mm", "details": "dettagli", "download": "download", + "displayAll": "Visualizza TUTTO", "empty": "vuota", "files": "file", "filter": "filtra", "folders": "cartelle", "grid": "griglia", "icons": "icone", - "language": "Linugua", + "info": "Informazioni", + "language": "Lingua", "lastModified": "Ultima modifica", "name": "Nome", "noMatch": "nessun risultato", + "pagination": "Paginatura", + "pagInputBtn": "GO", + "pagInputTxt": "pagina", "parentDirectory": "Cartella Superiore", + "perPage": "### per pagina", "search": "cerca", "size": "Dimensione", - "tree": "Albero", - "view": "Vista" + "tree": "Arborescenza", + "view": "Disposizione" } diff --git a/src/_h5ai/private/conf/l10n/ja.json b/src/_h5ai/private/conf/l10n/ja.json index 88266e78..2eaa5a0b 100644 --- a/src/_h5ai/private/conf/l10n/ja.json +++ b/src/_h5ai/private/conf/l10n/ja.json @@ -4,17 +4,25 @@ "dateFormat": "YYYY-MM-DD HH:mm", "details": "詳細", "download": "ダウンロード", + "displayAll": "すべてを表示", "empty": "(空)", "files": "ファイル", "filter": "フィルター", "folders": "フォルダー", "grid": "グリッド", "icons": "アイコン", + "info": "情報", "language": "言語", "lastModified": "最終変更日時", "name": "名前", "noMatch": "一致する項目が見つかりません", + "pagination": "ページネーション", + "pagInputBtn": "取得", + "pagInputTxt": "ページ", "parentDirectory": "親ディレクトリへ", + "perPage": "ページあたり###", + "search": "探索", "size": "サイズ", - "view": "ビュー" + "tree": "ツリー", + "view": "配置" } diff --git a/src/_h5ai/private/conf/l10n/ko.json b/src/_h5ai/private/conf/l10n/ko.json index 8c48cdbd..010a88f5 100644 --- a/src/_h5ai/private/conf/l10n/ko.json +++ b/src/_h5ai/private/conf/l10n/ko.json @@ -4,19 +4,25 @@ "dateFormat": "YYYY-MM-DD HH:mm", "details": "자세히", "download": "다운로드", + "displayAll": "모두 표시", "empty": "빈 폴더", "files": "파일", "filter": "필터", "folders": "폴더", "grid": "그리드", "icons": "아이콘", + "info": "정보", "language": "언어", "lastModified": "최근 수정일", "name": "파일명", "noMatch": "해당파일이 없습니다.", + "pagination": "쪽수 매기기", + "pagInputBtn": "이동", + "pagInputTxt": "페이지", "parentDirectory": "상위폴더", + "perPage": "페이지 당 ### 개", "search": "검색", "size": "크기", "tree": "트리", - "view": "보기" + "view": "처분" } diff --git a/src/_h5ai/private/conf/l10n/lv.json b/src/_h5ai/private/conf/l10n/lv.json index fa672cec..0eb3e7c4 100644 --- a/src/_h5ai/private/conf/l10n/lv.json +++ b/src/_h5ai/private/conf/l10n/lv.json @@ -4,19 +4,25 @@ "dateFormat": "YYYY-MM-DD HH:mm", "details": "detaļas", "download": "lejupielādēt", + "displayAll": "Parādīt VISU", "empty": "tukšs", "files": "faili", "filter": "filtrēt", "folders": "mapes", "grid": "režģis", "icons": "ikonas", + "info": "Informācija", "language": "Valoda", "lastModified": "Pēdējoreiz modificēts", "name": "Nosaukums", "noMatch": "nav sakritības", + "pagination": "Lapošana", + "pagInputBtn": "IET", + "pagInputTxt": "lapa", "parentDirectory": "Vecākdirektorijs", + "perPage": "### vienā lappusē", "search": "meklēt", "size": "Izmērs", "tree": "Koks", - "view": "Skats" + "view": "Dispozīcija" } diff --git a/src/_h5ai/private/conf/l10n/nb.json b/src/_h5ai/private/conf/l10n/nb.json index 44a1797c..91675c2c 100644 --- a/src/_h5ai/private/conf/l10n/nb.json +++ b/src/_h5ai/private/conf/l10n/nb.json @@ -1,15 +1,28 @@ { "lang": "norwegian", + "dateFormat": "YYYY-MM-DD HH:mm", "details": "detaljer", "download": "last ned", + "displayAll": "Vis ALLE", "empty": "tom", "files": "filer", + "filter": "filter", "folders": "mapper", + "grid": "nett", "icons": "ikoner", + "info": "Informasjon", + "language": "Språk", "lastModified": "Sist endret", "name": "Navn", "noMatch": "ingen treff", + "pagination": "Paginering", + "pagInputBtn": "GÅ", + "pagInputTxt": "side", "parentDirectory": "Overordnet mappe", - "size": "Størrelse" + "perPage": "### per side", + "search": "søk", + "size": "Størrelse", + "tree": "Tre", + "view": "Disposisjon" } diff --git a/src/_h5ai/private/conf/l10n/nl.json b/src/_h5ai/private/conf/l10n/nl.json index 8310f05e..3805b578 100644 --- a/src/_h5ai/private/conf/l10n/nl.json +++ b/src/_h5ai/private/conf/l10n/nl.json @@ -4,19 +4,25 @@ "dateFormat": "YYYY-MM-DD HH:mm", "details": "details", "download": "download", + "displayAll": "Alles weergeven", "empty": "leeg", "files": "bestanden", "filter": "filter", "folders": "mappen", "grid": "grid", "icons": "iconen", + "info": "Informatie", "language": "Taal", "lastModified": "Laatste wijziging", "name": "Naam", "noMatch": "geen overeenkomst", + "pagination": "Paginering", + "pagInputBtn": "GO", + "pagInputTxt": "pagina", "parentDirectory": "Bovenliggende map", + "perPage": "### per pagina", "search": "zoeken", "size": "Grootte", "tree": "Boom", - "view": "Bekijk" + "view": "Dispositie" } diff --git a/src/_h5ai/private/conf/l10n/pl.json b/src/_h5ai/private/conf/l10n/pl.json index da56967b..6278fa12 100644 --- a/src/_h5ai/private/conf/l10n/pl.json +++ b/src/_h5ai/private/conf/l10n/pl.json @@ -4,19 +4,25 @@ "dateFormat": "YYYY-MM-DD HH:mm", "details": "szczegóły", "download": "pobierz", + "displayAll": "Wyświetl WSZYSTKIE", "empty": "pusty", "files": "plików", "filter": "filtr", "folders": "folderów", "grid": "kafelki", "icons": "ikony", + "info": "Informacje", "language": "Język", "lastModified": "Ostatnia modyfikacja", "name": "Nazwa", "noMatch": "nie znaleziono", + "pagination": "Paginacja", + "pagInputBtn": "IŚĆ", + "pagInputTxt": "strona", "parentDirectory": "Katalog nadrzędny", + "perPage": "### na stronę", "search": "szukaj", "size": "Rozmiar", "tree": "Drzewo", - "view": "Układ" + "view": "Usposobienie" } diff --git a/src/_h5ai/private/conf/l10n/pt-br.json b/src/_h5ai/private/conf/l10n/pt-br.json index 1b0d6090..76f4c1fe 100644 --- a/src/_h5ai/private/conf/l10n/pt-br.json +++ b/src/_h5ai/private/conf/l10n/pt-br.json @@ -4,19 +4,25 @@ "dateFormat": "DD-MM-YYYY HH:mm", "details": "detalhes", "download": "download", + "displayAll": "Exibir TODOS", "empty": "vazio", "files": "arquivos", "filter": "filtro", "folders": "pastas", "grid": "grade", "icons": "ícones", + "info": "Informações", "language": "Idioma", "lastModified": "Última modificação", "name": "Nome", "noMatch": "sem resultados", + "pagination": "Paginação", + "pagInputBtn": "IR", + "pagInputTxt": "pagina", "parentDirectory": "Diretório acima", + "perPage": "### por pagina", "search": "pesquisa", "size": "Tamanho", "tree": "Árvore", - "view": "Visualização" + "view": "Disposição" } diff --git a/src/_h5ai/private/conf/l10n/pt-pt.json b/src/_h5ai/private/conf/l10n/pt-pt.json index bc956864..2470185c 100644 --- a/src/_h5ai/private/conf/l10n/pt-pt.json +++ b/src/_h5ai/private/conf/l10n/pt-pt.json @@ -4,19 +4,25 @@ "dateFormat": "DD-MM-YYYY HH:mm", "details": "detalhes", "download": "descarregar", + "displayAll": "Exibir TODOS", "empty": "vazio", "files": "arquivos", "filter": "filtro", "folders": "pastas", "grid": "grelha", "icons": "ícones", + "info": "Informações", "language": "Idioma", "lastModified": "última modificação", "name": "Nome", "noMatch": "sem resultados", + "pagination": "Paginação", + "pagInputBtn": "IR", + "pagInputTxt": "página", "parentDirectory": "Diretório acima", + "perPage": "### por página", "search": "pesquisa", "size": "Tamanho", "tree": "Árvore", - "view": "Visualização" + "view": "Disposição" } diff --git a/src/_h5ai/private/conf/l10n/ro.json b/src/_h5ai/private/conf/l10n/ro.json index 4981dfe0..feb6d2a8 100644 --- a/src/_h5ai/private/conf/l10n/ro.json +++ b/src/_h5ai/private/conf/l10n/ro.json @@ -3,13 +3,24 @@ "details": "detalii", "download": "descarcă", + "displayAll": "Afișați TOATE", "empty": "gol", "files": "fişiere", + "filter": "filtru", "folders": "dosar", - "icons": "pictograme", + "icons": "icoane", + "info": "informație", + "language": "Limba", "lastModified": "ultima modificare", "name": "nume", "noMatch": "0 rezultate", + "pagination": "Paginare", + "pagInputBtn": "MERGE", + "pagInputTxt": "pagină", "parentDirectory": "dosar părinte", - "size": "mărime" + "perPage": "### pe pagină", + "search": "căutare", + "size": "mărime", + "tree": "Arborele", + "view": "Dispoziţie" } diff --git a/src/_h5ai/private/conf/l10n/ru.json b/src/_h5ai/private/conf/l10n/ru.json index 8056a0d9..1b87ad98 100644 --- a/src/_h5ai/private/conf/l10n/ru.json +++ b/src/_h5ai/private/conf/l10n/ru.json @@ -4,17 +4,25 @@ "dateFormat": "YYYY-MM-DD HH:mm", "details": "Детали", "download": "Скачать", + "displayAll": "Показать ВСЕ", "empty": "Пусто", "files": "Файлы", "filter": "Фильтр", "folders": "Папки", "grid": "Сетка", "icons": "Иконки", + "info": "Информация", "language": "Язык", "lastModified": "Последние изменения", "name": "Имя", "noMatch": "Нет совпадений", + "pagination": "Пагинация", + "pagInputBtn": "ИДТИ", + "pagInputTxt": "страница", "parentDirectory": "Главная директория", + "perPage": "### на странице", + "search": "поиск", "size": "Размер", - "view": "Вид" + "tree": "Древесие", + "view": "Диспозиция" } diff --git a/src/_h5ai/private/conf/l10n/sk.json b/src/_h5ai/private/conf/l10n/sk.json index cfc9e45a..ee3e4bd1 100644 --- a/src/_h5ai/private/conf/l10n/sk.json +++ b/src/_h5ai/private/conf/l10n/sk.json @@ -2,12 +2,26 @@ "lang": "slovenčina", "details": "podrobnosti", + "download": "prenesi", + "displayAll": "Prikaži VSE", "empty": "prázdny", "files": "súborov", + "filter": "filtrirati", "folders": "priečinkov", + "grid": "mreža", "icons": "ikony", + "info": "Informácie", + "language": "Jezik", "lastModified": "Upravené", "name": "Názov", + "noMatch": "ni ujemanj", + "pagination": "Paginacija", + "pagInputBtn": "POJDI", + "pagInputTxt": "strani", "parentDirectory": "Nadriadený priečinok", - "size": "Velkosť" + "perPage": "### na stran", + "search": "iskanje", + "size": "Velkosť", + "tree": "Drevo", + "view": "Dispozicija" } diff --git a/src/_h5ai/private/conf/l10n/sl.json b/src/_h5ai/private/conf/l10n/sl.json index 5cdda214..13507b1d 100644 --- a/src/_h5ai/private/conf/l10n/sl.json +++ b/src/_h5ai/private/conf/l10n/sl.json @@ -4,15 +4,25 @@ "dateFormat": "DD. MM. YYYY HH:mm", "details": "podrobnosti", "download": "prenesi", + "displayAll": "Prikaži VSE", "empty": "prazno", "files": "datoteke", "filter": "filter", "folders": "mape", "grid": "mreža", "icons": "ikone", + "info": "Informacije", + "language": "Jezik", "lastModified": "Zadnja sprememba", "name": "Ime", "noMatch": "ni zadetkov", + "pagination": "Paginacija", + "pagInputBtn": "POJDI", + "pagInputTxt": "strani", "parentDirectory": "Nadrejena mapa", - "size": "Velikost" + "perPage": "### na stran", + "search": "iskanje", + "size": "Velikost", + "tree": "Drevo", + "view": "Dispozicija" } diff --git a/src/_h5ai/private/conf/l10n/sr.json b/src/_h5ai/private/conf/l10n/sr.json index 845eeab7..903fa492 100644 --- a/src/_h5ai/private/conf/l10n/sr.json +++ b/src/_h5ai/private/conf/l10n/sr.json @@ -3,13 +3,25 @@ "details": "detalji", "download": "download", + "displayAll": "Prikažite SVE", "empty": "prazno", "files": "fajlovi", + "filter": "filtrate", "folders": "direktorijum", + "grid": "mreža", "icons": "ikone", + "info": "Информације", + "language": "Jezik", "lastModified": "Poslednja modifikacija", "name": "Ime", "noMatch": "bez poklapanja", + "pagination": "Paginacija", + "pagInputBtn": "GO", + "pagInputTxt": "stranica", "parentDirectory": "Roditeljski direktorijum", - "size": "Veličina" + "perPage": "### po stranici", + "search": "pretraga", + "size": "Veličina", + "tree": "Mapa", + "view": "Dispozicija" } diff --git a/src/_h5ai/private/conf/l10n/sv.json b/src/_h5ai/private/conf/l10n/sv.json index 75638e53..0dd5c083 100644 --- a/src/_h5ai/private/conf/l10n/sv.json +++ b/src/_h5ai/private/conf/l10n/sv.json @@ -3,14 +3,25 @@ "details": "detaljerad", "download": "ladda ner", + "displayAll": "Visa ALLA", "empty": "tom", "files": "filer", + "filter": "filtrera", "folders": "kataloger", "grid": "rutnät", "icons": "ikoner", + "info": "Information", + "language": "Språk", "lastModified": "Senast ändrad", "name": "Filnamn", "noMatch": "ingen matchning", + "pagination": "Paginering", + "pagInputBtn": "GÅ", + "pagInputTxt": "sida", "parentDirectory": "Till överordnad mapp", - "size": "Filstorlek" + "perPage": "### per sida", + "search": "sök", + "size": "Filstorlek", + "tree": "Trädstruktur", + "view": "Arrangemang" } diff --git a/src/_h5ai/private/conf/l10n/tr.json b/src/_h5ai/private/conf/l10n/tr.json index 45cfc92d..1b802dbc 100644 --- a/src/_h5ai/private/conf/l10n/tr.json +++ b/src/_h5ai/private/conf/l10n/tr.json @@ -3,12 +3,25 @@ "details": "detaylar", "download": "indir", + "displayAll": "TÜMÜNÜ Görüntüle", "empty": "boş", "files": "dosyalar", + "filter": "filtre", "folders": "klasörler", + "grid": "ızgara", "icons": "ikonlar", + "info": "Bilgi", + "language": "Dil", "lastModified": "Son Düzenleme", "name": "İsim", + "noMatch": "eşleşme yok", + "pagination": "Sayfalandırma", + "pagInputBtn": "GİT", + "pagInputTxt": "sayfa", "parentDirectory": "Üst Dizin", - "size": "Boyut" + "perPage": "Sayfa başına ###", + "search": "arama", + "size": "Boyut", + "tree": "Ağaçlanma", + "view": "Yerleşim" } diff --git a/src/_h5ai/private/conf/l10n/uk.json b/src/_h5ai/private/conf/l10n/uk.json index 62908f56..17de6115 100644 --- a/src/_h5ai/private/conf/l10n/uk.json +++ b/src/_h5ai/private/conf/l10n/uk.json @@ -4,15 +4,25 @@ "dateFormat": "YYYY-MM-DD HH:mm", "details": "Деталі", "download": "Завантажити", + "displayAll": "Відобразити ВСЕ", "empty": "Порожньо", "files": "Файли(ів)", "filter": "Фільтр", "folders": "Тек(и)", "grid": "Гратка", "icons": "Піктограми", + "info": "Інформація", + "language": "Мова", "lastModified": "Останні зміни", "name": "Ім'я", "noMatch": "Немає співпадінь", + "pagination": "Пагінація", + "pagInputBtn": "піти", + "pagInputTxt": "сторінки", "parentDirectory": "Головна тека", - "size": "Розмір" + "perPage": "### на сторінку", + "search": "пошук", + "size": "Розмір", + "tree": "Дрівобережжя", + "view": "Диспозиція" } diff --git a/src/_h5ai/private/conf/l10n/zh-cn.json b/src/_h5ai/private/conf/l10n/zh-cn.json index 7cdba516..079e8fc5 100644 --- a/src/_h5ai/private/conf/l10n/zh-cn.json +++ b/src/_h5ai/private/conf/l10n/zh-cn.json @@ -4,20 +4,25 @@ "dateFormat": "YYYY-MM-DD HH:mm", "details": "详情", "download": "下载", + "displayAll": "显示全部", "empty": "空文件夹", "files": "文件", "filter": "过滤", "folders": "文件夹", "grid": "网格", "icons": "图标", + "info": "信息", "language": "语言", "lastModified": "修改时间", "name": "文件名", "noMatch": "无匹配项", + "pagination": "分页", + "pagInputBtn": "得到", + "pagInputTxt": "页", "parentDirectory": "父文件夹", + "perPage": "每页10条", "search": "搜索", "size": "大小", "tree": "树形目录", - "view": "视图", - "info": "信息" + "view": "视图" } diff --git a/src/_h5ai/private/conf/l10n/zh-tw.json b/src/_h5ai/private/conf/l10n/zh-tw.json index 7567f0d4..83d085c0 100644 --- a/src/_h5ai/private/conf/l10n/zh-tw.json +++ b/src/_h5ai/private/conf/l10n/zh-tw.json @@ -4,20 +4,25 @@ "dateFormat": "YYYY-MM-DD HH:mm", "details": "詳細資料", "download": "下載", + "displayAll": "顯示全部", "empty": "空資料夾", "files": "檔案", "filter": "過濾", "folders": "資料夾", "grid": "網格", "icons": "圖示", + "info": "資訊", "language": "語言", "lastModified": "上次修改", "name": "檔名", "noMatch": "沒有符合的檔案", + "pagination": "分頁", + "pagInputBtn": "得到", + "pagInputTxt": "頁", "parentDirectory": "上層目錄", + "perPage": "每頁###條", "search": "搜尋", "size": "大小", "tree": "樹形目錄", - "view": "檢視", - "info": "資訊" + "view": "檢視" } diff --git a/src/_h5ai/private/conf/options.json b/src/_h5ai/private/conf/options.json index a570da26..fbe3784d 100644 --- a/src/_h5ai/private/conf/options.json +++ b/src/_h5ai/private/conf/options.json @@ -48,6 +48,13 @@ The user selected view mode is also stored local in modern browsers so that it will be persistent. - modeToggle: boolean, show a view mode toggle in the toolbar, or "next" + - paginationItems: array of numbers + user selectable amounts of items to display at once until pagination occurs. + The first value will be selected as the default. Values are then sorted automatically. + Value "0" means display ALL items at once, no pagination needed (as an option). + It is recommended to place this value (if desired at all) at the end of the array. + The user selected amount is also stored local in modern browsers + so that is will be persistent. - setParentFolderLabels: boolean, set parent folder labels to real folder names - sizes: array of numbers the first value indicates the default view size. If only one value @@ -72,6 +79,7 @@ "maxIconSize": 40, "modes": ["details", "grid", "icons"], "modeToggle": false, + "paginationItems": [100, 50, 200, 300, 400, 500, 0], "setParentFolderLabels": true, "sizes": [20, 40, 60, 80, 100, 140, 180, 220, 260, 300], "theme": "comity", diff --git a/src/_h5ai/public/css/lib/view/pagination.less b/src/_h5ai/public/css/lib/view/pagination.less new file mode 100644 index 00000000..57196a6d --- /dev/null +++ b/src/_h5ai/public/css/lib/view/pagination.less @@ -0,0 +1,103 @@ +// @minWidth: 30px; +// @height: 28px; +// @lineHeight: @height; +// @activeHeight: @height + 2; +@inputWidth: 35px; +@inputHeight: 28px; +@buttonMinWidth: 40px; +@buttonHeight: 30px; +@buttonLineHeight: @buttonHeight - 2; +@buttonPadding: 0 8px; +// @navHeight: @activeHeight; +@col-hover-green: #44EEAA; +@col-placeholder-grey: rgb(170, 170, 170); + +#pagination_btm { + + position: -webkit-sticky; /* Safari */ + position: sticky; + bottom: 0; + + .nav_buttons { + display: flex; + flex-wrap: wrap; + justify-content: center; + align-items: center; + position: -webkit-sticky; /* Safari */ + position: sticky; + bottom: 0; + } + + .nav_buttons button { + width: @buttonMinWidth; // 20px; + height: @buttonHeight; // 30px; + appearance: none; + border: none; + outline: none; + cursor: pointer; + padding: 0; + background-color: @col-link; + margin: 5px; + transition: 0.4s; + color: @col-back; + font-size: @font-size; + text-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2); + box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2); + &:hover { + background-color: @col-hover-green + } + &:disabled { + background-color: @col-text-disabled-black; + box-shadow: inset 0px 0px 4px rgb(0, 0, 0); + cursor: default; + } + } + + .page_input { + display: flex; + align-content: flex-end; + float: left; + margin-left: 5px; + margin-right: 5px; + font-size: @font-size; + > input[type="text"]{ + width: @inputWidth; + height: @inputHeight; + background: @col-back; + border-radius: 3px; + border: 1px solid @col-divider-black; + padding: @buttonPadding; + text-align: center; + vertical-align: baseline; + outline: none; + box-shadow: none; + box-sizing: initial; + &::placeholder { + color: @col-placeholder-grey; + opacity: 1; /* Firefox */ + } + &:focus::placeholder { + color: transparent; + } + } + + > input[type="button"]{ + min-width: @buttonMinWidth; + height: @buttonHeight; + line-height: @buttonLineHeight; + background: @col-back; + border-radius: 3px; + border: 1px solid @col-divider-black; + text-align: center; + padding: @buttonPadding; + vertical-align: baseline; + outline: none; + box-shadow: none; + color: @col-text; + cursor: pointer; + &:hover{ + background-color: @col-hover-green; + } + } + } +} diff --git a/src/_h5ai/public/js/lib/ext/l10n.js b/src/_h5ai/public/js/lib/ext/l10n.js index 0d74dce8..e1a5ca30 100644 --- a/src/_h5ai/public/js/lib/ext/l10n.js +++ b/src/_h5ai/public/js/lib/ext/l10n.js @@ -18,6 +18,7 @@ const defaultTranslations = { dateFormat: 'YYYY-MM-DD HH:mm', details: 'details', + displayAll: "Display ALL", download: 'download', empty: 'empty', files: 'files', @@ -25,11 +26,16 @@ const defaultTranslations = { folders: 'folders', grid: 'grid', icons: 'icons', + info: 'Informations', language: 'Language', lastModified: 'Last modified', name: 'Name', noMatch: 'no match', + pagination: "Pagination", + pagInputBtn: "GO", + pagInputTxt: "page", parentDirectory: 'Parent Directory', + perPage: "### per page", search: 'search', size: 'Size', tree: 'Tree', @@ -62,6 +68,9 @@ const update = lang => { each(currentLang, (value, key) => { dom('.l10n-' + key).text(value); dom('.l10n_ph-' + key).attr('placeholder', value); + replace(dom('.l10n_rp-' + key), value); + dom('.l10n_val-' + key).val(value); + dom('.l10n_title-' + key).prop('title', value) }); format.setDefaultDateFormat(currentLang.dateFormat); @@ -70,6 +79,15 @@ const update = lang => { }); }; +const replace = (elem, value) => { + if (!elem.length) { + return; + } + each(elem, el => { + el.text = value.replace('###', el.value); + }); +}; + const loadLanguage = isoCode => { if (loaded[isoCode]) { return Promise.resolve(loaded[isoCode]); diff --git a/src/_h5ai/public/js/lib/ext/select.js b/src/_h5ai/public/js/lib/ext/select.js index ab7d633f..c75e9a21 100644 --- a/src/_h5ai/public/js/lib/ext/select.js +++ b/src/_h5ai/public/js/lib/ext/select.js @@ -193,7 +193,7 @@ const init = () => { if (settings.clickndrag) { $selectionRect.hide().appTo('#content'); - dom('#content') + dom('#view') .on('mousedown', selectionStart) .on('drag', ev => ev.preventDefault()) .on('dragstart', ev => ev.preventDefault()); diff --git a/src/_h5ai/public/js/lib/ext/sort.js b/src/_h5ai/public/js/lib/ext/sort.js index a1eaa9da..4b0fb8e3 100644 --- a/src/_h5ai/public/js/lib/ext/sort.js +++ b/src/_h5ai/public/js/lib/ext/sort.js @@ -3,6 +3,7 @@ const event = require('../core/event'); const resource = require('../core/resource'); const allsettings = require('../core/settings'); const store = require('../core/store'); +const pagination = require('../view/pagination'); const settings = Object.assign({ enabled: false, @@ -22,8 +23,8 @@ const columnClasses = {0: 'label', 1: 'date', 2: 'size'}; const cmpFn = (prop, reverse, ignorecase, natural) => { return (el1, el2) => { - const item1 = el1._item; - const item2 = el2._item; + const item1 = el1._item === undefined ? el1 : el1._item; + const item2 = el2._item === undefined ? el2 : el2._item; let res = getTypeOrder(item1) - getTypeOrder(item2); if (res !== 0) { @@ -58,16 +59,32 @@ const sortItems = (column, reverse) => { $headers.rmCls('ascending').rmCls('descending'); $header.addCls(reverse ? 'descending' : 'ascending'); + if (pagination.isSortHandled(fn)) { + return; + } dom(toArray(dom('#items .item:not(.folder-parent)')).sort(fn)).appTo('#items'); }; const onContentChanged = () => { + if (pagination.isActive()){ + return; + } + + let {column, reverse} = getSortOrder(); + sortItems(column, reverse); +}; + +const getSortOrder = () => { const order = store.get(storekey); const column = order && order.column || settings.column; const reverse = order && order.reverse || settings.reverse; + return {column, reverse}; +} - sortItems(column, reverse); -}; +const getSortFunc = () => { + let {column, reverse} = getSortOrder(); + return cmpFn(columnProps[column], reverse, settings.ignorecase, settings.natural); +} const addToggles = () => { const $header = dom('#items li.header'); @@ -94,3 +111,7 @@ const init = () => { init(); + +module.exports = { + getSortFunc +} diff --git a/src/_h5ai/public/js/lib/view/pagination.js b/src/_h5ai/public/js/lib/view/pagination.js new file mode 100644 index 00000000..401bf67e --- /dev/null +++ b/src/_h5ai/public/js/lib/view/pagination.js @@ -0,0 +1,437 @@ +const {each, includes, dom, values} = require('../util'); +const event = require('../core/event'); +const store = require('../core/store'); +const allsettings = require('../core/settings'); +const base = require('./base'); + +const paginationItems = [100, 0, 50, 250, 500]; +const settings = Object.assign({ + paginationItems, + hideParentFolder: false, +}, allsettings.view); +const defaultSize = settings.paginationItems.length ? settings.paginationItems[0] : 0; +const sortedSizes = [...new Set(settings.paginationItems)].sort((a, b) => a - b) +const storekey = 'pagination'; +const paginationTpl = + ``; +const selectorTpl = + `
+

Pagination

+
+ + +
+
`; +const $pagination = dom(paginationTpl); +const btn_cls = { + 'btn_first': '<<', + 'btn_prev': '<', + 'btn_next': '>', + 'btn_last': '>>' +}; + +let pag_active = false; +let pag_buttons = []; +let pag_current_page = 1; +let pag_items; +let pag_payload; +let pag_view; +let pag_count = 0; +let pag_parent_folder; +let pag_rows_pref; +let sortfn; + +const setup = (items) => { + updateItems(items); + pag_current_page = 1; + pag_buttons = []; + let $pagination_els = base.$content.find('.nav_buttons'); + setupNavigation($pagination_els); + pag_active = true; + updateSortFunc(); + sort(sortfn()); + setCurrentPage(1); +} + +const updateSortFunc = () => { + // Lazy load because sort module needs us loaded beforehand + sortfn = require('../ext/sort').getSortFunc; +} + +const updateItems = (items) => { + if (!items){ + return; // use cached items instead + } + pag_items = items; + popParentFolder(pag_items); + totalPages(); + return; +} + +const clear = () => { + if (pag_active){ + pag_buttons.forEach(e => e.remove()); + pag_buttons = []; + } + pag_active = false; +} + +const isActive = () => { + return pag_active; +} + +const totalPages = () => { + if (pag_rows_pref == 0){ // ALL + return pag_count = 1; + } + pag_count = Math.ceil(pag_items.length / pag_rows_pref); + return pag_count; +} + +const popParentFolder = (items) => { + if (items.length > 0 && !settings.hideParentFolder){ + pag_parent_folder = items.shift(); + return; + } + pag_parent_folder = undefined; +} + +const pushParentFolder = (items) => { + if (pag_parent_folder && items[0] !== pag_parent_folder) { + items.unshift(pag_parent_folder); + } +} + +const setCurrentPage = (page) => { + if (!page) { + page = (pag_current_page <= pag_count) ? pag_current_page : pag_count; + } + pag_current_page = page; + + const paginatedItems = computeSlice(pag_items, page, pag_rows_pref); + + pushParentFolder(paginatedItems); + + updateButtons(); + if (pag_count <= 1) { + base.$content.find('.nav_buttons').addCls('hidden'); + pag_active = false; + } else { + base.$content.find('.nav_buttons').rmCls('hidden'); + pag_active = true; + } + pag_view.doSetItems(paginatedItems); +} + +const computeSlice = (items, page, rows_per_page) => { + if (!rows_per_page) { // ALL + return items; + } + page--; + const start = rows_per_page * page; + const end = start + rows_per_page; + return items.slice(start, end); +} + +const sort = (fn) => { + // We don't need parent folder item, so we don't filterPayload() + pag_items = values(pag_payload.content).sort(fn); +} + +const setupNavigation = (container) => { + each(container, key => { + key.innerHTML = ""; + }); + + each(container, el => { + for (let key in btn_cls) { + const btn = paginationButton(key, btn_cls[key]); + el.appendChild(btn); + pag_buttons.push(btn); + } + }); + + each(container, key => { + // Page status numbers + let div = updatePageStatus(null); + key.insertBefore(div, key.childNodes[2]); + pag_buttons.push(div); + + // Manual page number selection + div = document.createElement('div'); + div.classList.add('page_input'); + let {input_field, input_btn} = pageInputForm(); + div.appendChild(input_field); + div.appendChild(input_btn); + key.appendChild(div); + pag_buttons.push(input_field); + pag_buttons.push(input_btn); + }); +} + +const paginationButton = (classname, arrow) => { + const button = document.createElement('button'); + button.innerText = arrow; + button.classList.add('nav_button'); + + button.id = classname; + + switch (classname) { + case 'btn_prev': + button.req_page = () => pag_current_page - 1; + button.disabled = true; + break; + case 'btn_next': + button.req_page = () => pag_current_page + 1; + button.disabled = false; + break; + case 'btn_last': + button.req_page = () => pag_count; + button.disabled = false; + break; + default: // 'btn_first' + button.req_page = () => 1; + button.disabled = true; + } + button.addEventListener('click', function() { + setCurrentPage(this.req_page()); + }); + return button; +}; + +const updateButtons = () => { + const prev_buttons = dom('#btn_first, #btn_prev'); + const next_buttons = dom('#btn_next, #btn_last'); + if (pag_current_page <= 1) { + each(prev_buttons, button => button.disabled = true); + each(next_buttons, button => button.disabled = false); + } else if (pag_current_page >= pag_count && pag_current_page > 1) { + each(next_buttons, button => button.disabled = true); + each(prev_buttons, button => button.disabled = false); + } else { + const nav_buttons = dom('#btn_first, #btn_prev, #btn_next, #btn_last'); + each(nav_buttons, button => button.disabled = false); + } + const pag_pos = dom('.pag_pos'); + each(pag_pos, el => updatePageStatus(el)); +} + +const updatePageStatus = (div) => { + const status = pag_current_page.toString().concat('/', pag_count.toString()); + if (!div) { + const div = document.createElement('div'); + div.appendChild(document.createTextNode(status)); + div.classList.add('pag_pos'); + return div; + } + return div.innerText = status; +} + +const pageInputForm = () => { + const input_field = document.createElement('input'); + input_field.type = 'text'; + // Use title instead of placeholder due to some translations not fitting in + input_field.classList.add('l10n_title-pagInputTxt'); // input_field.title = 'page'; + input_field.placeholder = '...'; + + const input_btn = document.createElement('input'); + input_btn.type = 'button'; + input_btn.classList.add('l10n_val-pagInputBtn'); // input_btn.value = 'GO'; + + input_btn.addEventListener('click', () => { + if (input_field.value !== '' && input_field.value !== pag_current_page) { + let parsed = parseInt(input_field.value, 10); + if (!isNaN(parsed)) { + setCurrentPage(parsed); + } + } + input_field.value = ""; + input_field.focus(); + }); + + input_field.addEventListener('keydown', (e) => { + if (e.key === 'Enter' && input_field.value && /[^\s]/.test(input_field.value)) { + if (input_field.value !== pag_current_page) { + e.preventDefault(); + let parsed = parseInt(input_field.value, 10); + if (!isNaN(parsed) && parsed !== pag_current_page) { + setCurrentPage(parsed); + } + } + input_field.value = ""; + input_field.focus(); + }; + }); + + // Only allow digits, new line and max page, no leading zero or spaces + setInputFilter(input_field, (value) => { + return /^[^0\s][\d]*$/.test(value) && value <= pag_count; + }); + + return {input_field, input_btn}; +} + +// Restricts input for the given textbox to the given inputFilter function. +// In the future we could use beforeinput instead. +function setInputFilter(textbox, inputFilter) { + ["input", "keydown", "keyup", "mousedown", "mouseup", "select", + "contextmenu", "drop"].forEach(function(event) { + textbox.addEventListener(event, function(e) { + if (this.value === '') { + this.oldValue = this.value; + } + if (inputFilter(this.value)) { + this.oldValue = this.value; + this.oldSelectionStart = this.selectionStart; + this.oldSelectionEnd = this.selectionEnd; + } else if (this.hasOwnProperty("oldValue")) { + this.value = this.oldValue; + this.setSelectionRange(this.oldSelectionStart, this.oldSelectionEnd); + } else { + this.value = ""; + } + }); + }); +} + +const initPagSelector = () => { + if (settings.paginationItems.length > 0) { + dom(selectorTpl).appTo('#sidebar'); + + document.querySelector('#pag_select') + .addEventListener('change', onSelect); + + for (let option of addOptions(getCachedPref())) { + option.appTo('#pag_select'); + } + } +}; + +function onSelect() { + setPref(parseInt(this.value, 10)); + onPagPrefUpdated(); +} + +const addOptions = (cached_pref) => { + const options = []; + let set_default = false; + for (let size of sortedSizes) { + let element; + if (size === cached_pref && !set_default) { + element = dom(``); + set_default = true; + } else { + element = dom(``); + } + element.addCls((size === 0) ? 'l10n-displayAll' : 'l10n_rp-perPage'); + options.push(element); + } + return options; +} + +const onLocationChanged = () => { + // Workaround to append this to the sidebar at the last position + // since the view module includes us before the other extensions + if (dom('#pag_select').length === 0) { + initPagSelector(); + } +} + +const setPayload = (payload) => { + // Not a copy, but we probably won't alter it anyway. + pag_payload = payload; +} + +const getCachedPref = () => { + if (pag_rows_pref === undefined) + return defaultSize; + return pag_rows_pref; +}; + +// The module won't work if a view is not set first. We need to reuse some funcs +const setView = (view) => { + pag_view = view; +} + +const canHandle = (items) => { + clear(); + if (items.length > getCachedPref()) { + // Probably won't alter it, so we don't make a copy to save memory. + setup(items); + return true; + } + return false; +} + +const isSortHandled = (fn) => { + if (!pag_active) { + return false; + } + sort(fn); + setCurrentPage(); + return true; +} + +const onPagPrefUpdated = () => { + if (pag_active) { + totalPages(); + setCurrentPage(); + return; + } + const pref = getCachedPref(); + if (values(pag_payload.content).length > pref && pref != 0) { + setup(pag_view.filterPayload(pag_payload)); + } +} + +const isRefreshHandled = (item) => { + setPayload(item); + // Block if pagination is active + if (values(item.content).length > getCachedPref()) { + if (pag_active){ + updateItems(pag_view.filterPayload(item)); + sort(sortfn()); // initial sort + setCurrentPage(); + return true; + } + setup(pag_view.filterPayload(item)); + return true; + } + // No need for pagination, recreate the items, hide & pass to default logic + if (pag_active){ + updateItems(pag_view.filterPayload(item)); + setCurrentPage(1); + clear(); + return true; + } + // We are not interested in handling the items + return false; +} + +const setPref = (size) => { + const stored = store.get(storekey); + size = (size !== undefined) ? size : stored ? stored : defaultSize; + size = includes(settings.paginationItems, size) ? size : defaultSize; + store.put(storekey, size); + pag_rows_pref = size; +} + +const init = () => { + setPref(); + event.sub('location.changed', onLocationChanged); +}; + +init(); + +module.exports = { + $el: $pagination, + canHandle, + isActive, + isRefreshHandled, + isSortHandled, + setPayload, + setView +} diff --git a/src/_h5ai/public/js/lib/view/view.js b/src/_h5ai/public/js/lib/view/view.js index aff35efb..7af59b9f 100644 --- a/src/_h5ai/public/js/lib/view/view.js +++ b/src/_h5ai/public/js/lib/view/view.js @@ -6,6 +6,7 @@ const resource = require('../core/resource'); const store = require('../core/store'); const allsettings = require('../core/settings'); const base = require('./base'); +const pagination = require('./pagination'); const modes = ['details', 'grid', 'icons']; const sizes = [20, 40, 60, 80, 100, 150, 200, 250, 300, 350, 400]; @@ -183,6 +184,12 @@ const checkHint = () => { }; const setItems = items => { + if (!pagination.canHandle(items)) { + doSetItems(items); + } +}; + +const doSetItems = items => { const removed = map($items.find('.item'), el => el._item); $items.find('.item').rm(); @@ -218,6 +225,15 @@ const onLocationChanged = item => { item = location.getItem(); } + pagination.setPayload(item); + + const items = filterPayload(item); + + setHint('empty'); + setItems(items); +}; + +const filterPayload = item => { const items = []; if (item.parent && !settings.hideParentFolder) { @@ -229,12 +245,18 @@ const onLocationChanged = item => { items.push(child); } }); - - setHint('empty'); - setItems(items); -}; + return items; +} const onLocationRefreshed = (item, added, removed) => { + if (added.length === 0 && removed.length === 0){ + return; + } + + if (pagination.isRefreshHandled(item)) { + return; + } + const add = []; each(added, child => { @@ -263,6 +285,7 @@ const init = () => { set(); $view.appTo(base.$content); + pagination.$el.appTo(base.$content); $hint.hide(); format.setDefaultMetric(settings.binaryPrefix); @@ -277,7 +300,9 @@ init(); module.exports = { $el: $view, + filterPayload, setItems, + doSetItems, changeItems, setLocation: onLocationChanged, setHint, @@ -288,3 +313,6 @@ module.exports = { getSize, setSize }; + +// For code reuse purposes +pagination.setView(module.exports);