Merge pull request #521 from plebbit/master

Development
This commit is contained in:
Tom (plebeius.eth)
2024-09-05 21:21:05 +02:00
committed by GitHub
44 changed files with 485 additions and 83 deletions
+56
View File
@@ -1,3 +1,58 @@
## [0.2.5](https://github.com/plebbit/plebchan/compare/v0.2.4...v0.2.5) (2024-09-04)
### Bug Fixes
* **board buttons:** buttons would wrap incorrectly on small window width ([385acb0](https://github.com/plebbit/plebchan/commit/385acb08fd24eff3dac4d1f029817ceb28597f4e))
* **catalog post preview:** special characters were able to overflow ([48b55ed](https://github.com/plebbit/plebchan/commit/48b55ed972e8d20d108086175b7838f43d2983a6))
* **edit menu:** checkbox would appear dark in floating post from quote ([c354d72](https://github.com/plebbit/plebchan/commit/c354d72e0ac561291a44822ad9f84e7d8c02059b))
* **edit menu:** couldn't edit post content if post was just published ([9543f16](https://github.com/plebbit/plebchan/commit/9543f16f683d2d90041edab895a571d30a30baae))
* **edit menu:** modal position would bug out when resizing textarea to edit post content ([4858cea](https://github.com/plebbit/plebchan/commit/4858ceadc98ee367c1d81a59dce67a4c78b3df10))
* **edit menu:** remove autofocus, it caused auto scroll ([e9c7e86](https://github.com/plebbit/plebchan/commit/e9c7e868f245ec803823ca372d848debf96d9376))
* **edit menu:** textarea to edit content was too small ([d52c29f](https://github.com/plebbit/plebchan/commit/d52c29f78148fa2641c5abadd3856a10e4ae492d))
* **home:** "use catalog" button didn't work for some addresses ([5c846fc](https://github.com/plebbit/plebchan/commit/5c846fcdc8a23ead278868c92bc6c9443ea231c8))
* **home:** options modal flickered when clicked twice ([30b9152](https://github.com/plebbit/plebchan/commit/30b91521b9a3e4daef86f696b18addb7149bcff8))
* **markdown:** don't allow horizontal lines, they look confusing inside of post content ([1eb64ed](https://github.com/plebbit/plebchan/commit/1eb64ede3dfba50b9e77d47c9c4dd7f8d3db4c5d))
* **markdown:** single returns would be rendered as spaces ([495e9e2](https://github.com/plebbit/plebchan/commit/495e9e25b5f5cdb19661318f552d1b2908fba987))
* **markdown:** users couldn't include empty lines in the post content ([38790a2](https://github.com/plebbit/plebchan/commit/38790a25966aea4217550d76ef1766bd2c5abefd))
* **pending post page:** opening settings would change theme ([5095e0e](https://github.com/plebbit/plebchan/commit/5095e0e3b9cc27b0a998a4bd646a613e69f6a0e5))
* **pending post:** "[Reply]" button and post menu shouldn't be clickable ([0cb386c](https://github.com/plebbit/plebchan/commit/0cb386cf662a570c3dd5772ec50bdbba56243618))
* **popular threads box:** in each post content, one return would appear as two returns (empty lines) ([cfe8686](https://github.com/plebbit/plebchan/commit/cfe8686d94c6ad0df05fe6a240ef25b1840429be))
* **post form:** opening settings would close post form ([17f57a1](https://github.com/plebbit/plebchan/commit/17f57a1d7d0fa47aa6f5fa97c803063734615173))
* **post form:** user could post empty comment using spaces ([3d2d510](https://github.com/plebbit/plebchan/commit/3d2d510259b0e7ac4bcfecdff872d928a550709c))
* **post menu:** 'hide post' button wasn't appearing in thread page on desktop ([f7bab7c](https://github.com/plebbit/plebchan/commit/f7bab7c83e92b24220c8244f4e1f7d0754ebb1a7))
* **post menu:** 'view on (client)' link was broken on multisubs ([25722d7](https://github.com/plebbit/plebchan/commit/25722d74a3e048c03d69d924a644886fdb70310f))
* **post mobile:** tooltip for title wasn't centered ([ca0020f](https://github.com/plebbit/plebchan/commit/ca0020f2c5d360d1e77a4bfcc716bf162a1c9174))
* **post:** 'comment too long' link was broken for description and rules ([2ab7197](https://github.com/plebbit/plebchan/commit/2ab71978a7329fd0d58e0ce028332cd25b65c931))
* **post:** "c/" was clickable while post is pending ([74ddae0](https://github.com/plebbit/plebchan/commit/74ddae0ed7a9fc9b1724355d076dbdb13107c861))
* **post:** "c/Pending" could appear on first render ([2590a9c](https://github.com/plebbit/plebchan/commit/2590a9c096657ce53d016f3570189a2bc7085930))
* **post:** clicking the quotelink or backlink to a reply wouldn't scroll to the reply more than once in a row ([e1422d0](https://github.com/plebbit/plebchan/commit/e1422d005419f21ddf039c76021156679146dc91))
* **post:** deleted or removed comments still showed display name, avatar, role and ID ([b7e443d](https://github.com/plebbit/plebchan/commit/b7e443d7d3d1e7c9e79b5996e34ae856057253fc))
* **post:** don't show link if comment is removed or deleted ([068c30a](https://github.com/plebbit/plebchan/commit/068c30a3222877c816b22601920c0d03a18b7c18))
* **post:** edited timestamp showed html on mobile ([ba49060](https://github.com/plebbit/plebchan/commit/ba4906058db17c474308c501ea756ee504140f6d))
* **post:** reply backlink didn't appear in post info immediately after replying to it ([0f6b922](https://github.com/plebbit/plebchan/commit/0f6b9225165983986771a712787c30f5a5215c8d))
* **post:** some gifs would appear animated before expanded ([5a56016](https://github.com/plebbit/plebchan/commit/5a56016c85bf5f7ac78af8ce3783e71c1eb8181b))
* **replymodal:** replying didn't work from multiboard feeds (p/all, p/subscriptions) ([f6548cc](https://github.com/plebbit/plebchan/commit/f6548cc2b826ba4b80d9d7511df17891408e016a))
* **theme:** changing theme in sfw sub wouldn't change it for p/all and p/subscriptions. it should because sfw is the default ([f06c50e](https://github.com/plebbit/plebchan/commit/f06c50ef33a3b5fc82c8532c144fd87e7be291d4))
* **theme:** theme changed incorrectly in pending post page ([4e390a9](https://github.com/plebbit/plebchan/commit/4e390a9fc573610ae76249b9126a42d85b442a87))
* **use-replies:** a reply to a newly-published reply wouldn't render until propagated ([a698b22](https://github.com/plebbit/plebchan/commit/a698b222f8a22bf3a4e5850cd5328b81cebbbdfa))
### Features
* **board stats:** remember hide/show choice per subplebbit ([d482d32](https://github.com/plebbit/plebchan/commit/d482d3246744b0d7701888fa0ce18433d7798381))
* **feed:** show account comments instantly in the feed once published, instead of waiting for the feed to update ([8598d10](https://github.com/plebbit/plebchan/commit/8598d1056ee9b08cb146b129356c28c14a8ec79a))
* **markdown:** when the user is publishing a comment, automatically format it to follow markdown rules ([c521ccb](https://github.com/plebbit/plebchan/commit/c521ccbc2ebf2d4d67889a28733d07eab4b8fa7b))
* **pending post:** show board navigation, stats and post form ([cdee29e](https://github.com/plebbit/plebchan/commit/cdee29e94ffa7cb616aacd34719114d384e60278))
* **post form:** add link media info for static or animated gifs ([4103fab](https://github.com/plebbit/plebchan/commit/4103fabb12c2b7f57c6c07808af4b7c213408852))
* **post:** add button to show full comment when it's too long ([99a2197](https://github.com/plebbit/plebchan/commit/99a219733c65138616976fd3f3f71a6b90199909))
* **post:** add user ID with color specific to user address ([8dfe209](https://github.com/plebbit/plebchan/commit/8dfe2098ce14e77898805093b5ce28c610f1b098))
* **post:** show embed of link in post content even if it doesn't have a thumbnail ([09a1441](https://github.com/plebbit/plebchan/commit/09a14416c8bcbd722ebeb3bbc0b158bf12c1190b))
* **settings:** add anon mode - automatically use a different user ID in each thread ([db67a94](https://github.com/plebbit/plebchan/commit/db67a9452c048c5abc954cbae345269495ab6c65))
* **settings:** add option to hide avatars ([5b7acbc](https://github.com/plebbit/plebchan/commit/5b7acbc5689d9cebee10d0ba8661227c9996b3cf))
## [0.2.4](https://github.com/plebbit/plebchan/compare/v0.2.3...v0.2.4) (2024-07-23) ## [0.2.4](https://github.com/plebbit/plebchan/compare/v0.2.3...v0.2.4) (2024-07-23)
@@ -7,6 +62,7 @@
* **board title:** offline icon would appear in p/all and p/subscriptions ([38e60fd](https://github.com/plebbit/plebchan/commit/38e60fd797812756480c84d46fb81a4223efec9a)) * **board title:** offline icon would appear in p/all and p/subscriptions ([38e60fd](https://github.com/plebbit/plebchan/commit/38e60fd797812756480c84d46fb81a4223efec9a))
* **catalog post:** it was not possible to scroll past the floating post preview ([9960e40](https://github.com/plebbit/plebchan/commit/9960e400e822214377842cf43789a20c5324caf8)) * **catalog post:** it was not possible to scroll past the floating post preview ([9960e40](https://github.com/plebbit/plebchan/commit/9960e400e822214377842cf43789a20c5324caf8))
* **edit menu:** reason field would reset at menu close ([15462f1](https://github.com/plebbit/plebchan/commit/15462f14ede7b0b3920ae62305b2bc3b112476da)) * **edit menu:** reason field would reset at menu close ([15462f1](https://github.com/plebbit/plebchan/commit/15462f14ede7b0b3920ae62305b2bc3b112476da))
* **electron:** download url redirect status code changed ([c63b950](https://github.com/plebbit/plebchan/commit/c63b9507dec80626d22dbeb7d5663ea647b0358f))
* **iframe:** background was white in tomorrow theme ([8d766cc](https://github.com/plebbit/plebchan/commit/8d766cc9e3b1bf668b02fcaa651678b4cb125b38)) * **iframe:** background was white in tomorrow theme ([8d766cc](https://github.com/plebbit/plebchan/commit/8d766cc9e3b1bf668b02fcaa651678b4cb125b38))
* **markdown:** bullet point lists were bugged ([9552938](https://github.com/plebbit/plebchan/commit/9552938b6de5fd3d860cca8c9335ce6f1487adbb)) * **markdown:** bullet point lists were bugged ([9552938](https://github.com/plebbit/plebchan/commit/9552938b6de5fd3d860cca8c9335ce6f1487adbb))
* **post menu:** block button was visible for description and rules ([4ffd750](https://github.com/plebbit/plebchan/commit/4ffd75010d53dbf068fd6e4040954a6902163d10)) * **post menu:** block button was visible for description and rules ([4ffd750](https://github.com/plebbit/plebchan/commit/4ffd75010d53dbf068fd6e4040954a6902163d10))
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "plebchan", "name": "plebchan",
"version": "0.2.4", "version": "0.2.5",
"description": "A GUI for plebbit similar to 4chan", "description": "A GUI for plebbit similar to 4chan",
"type": "module", "type": "module",
"author": "plebeius.eth", "author": "plebeius.eth",
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "وضع مجهول", "anon_mode": "وضع مجهول",
"anon_mode_description": "يتم استخدام معرف مستخدم مختلف تلقائيًا في كل موضوع", "anon_mode_description": "يتم استخدام معرف مستخدم مختلف تلقائيًا في كل موضوع",
"pending": "قيد الانتظار", "pending": "قيد الانتظار",
"failed": "فشل" "failed": "فشل",
"add": "أضف",
"pattern": "نمط",
"enable": "تفعيل",
"order": "ترتيب"
} }
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "অজ্ঞাত মোড", "anon_mode": "অজ্ঞাত মোড",
"anon_mode_description": "প্রতিটি থ্রেডে স্বয়ংক্রিয়ভাবে একটি ভিন্ন ব্যবহারকারীর আইডি ব্যবহার করুন", "anon_mode_description": "প্রতিটি থ্রেডে স্বয়ংক্রিয়ভাবে একটি ভিন্ন ব্যবহারকারীর আইডি ব্যবহার করুন",
"pending": "অপেক্ষমাণ", "pending": "অপেক্ষমাণ",
"failed": "ব্যর্থ" "failed": "ব্যর্থ",
"add": "যোগ করুন",
"pattern": "প্যাটার্ন",
"enable": "সক্রিয় করুন",
"order": "অর্ডার"
} }
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Anonymní režim", "anon_mode": "Anonymní režim",
"anon_mode_description": "Automaticky používejte jiný uživatelský ID v každém vlákně", "anon_mode_description": "Automaticky používejte jiný uživatelský ID v každém vlákně",
"pending": "Čeká na schválení", "pending": "Čeká na schválení",
"failed": "Nepodařilo se" "failed": "Nepodařilo se",
"add": "Přidat",
"pattern": "Vzor",
"enable": "Povolit",
"order": "Pořadí"
} }
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Anonim tilstand", "anon_mode": "Anonim tilstand",
"anon_mode_description": "Brug automatisk en anden bruger-ID i hver tråd", "anon_mode_description": "Brug automatisk en anden bruger-ID i hver tråd",
"pending": "Afventer", "pending": "Afventer",
"failed": "Mislykkedes" "failed": "Mislykkedes",
"add": "Tilføj",
"pattern": "Mønster",
"enable": "Aktiver",
"order": "Rækkefølge"
} }
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Anonymer Modus", "anon_mode": "Anonymer Modus",
"anon_mode_description": "Verwenden Sie automatisch eine andere Benutzer-ID in jedem Thread", "anon_mode_description": "Verwenden Sie automatisch eine andere Benutzer-ID in jedem Thread",
"pending": "Ausstehend", "pending": "Ausstehend",
"failed": "Fehlgeschlagen" "failed": "Fehlgeschlagen",
"add": "Hinzufügen",
"pattern": "Muster",
"enable": "Aktivieren",
"order": "Reihenfolge"
} }
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Λειτουργία ανωνυμίας", "anon_mode": "Λειτουργία ανωνυμίας",
"anon_mode_description": "Χρησιμοποιήστε αυτόματα διαφορετικό αναγνωριστικό χρήστη σε κάθε νήμα", "anon_mode_description": "Χρησιμοποιήστε αυτόματα διαφορετικό αναγνωριστικό χρήστη σε κάθε νήμα",
"pending": "Σε εκκρεμότητα", "pending": "Σε εκκρεμότητα",
"failed": "Απέτυχε" "failed": "Απέτυχε",
"add": "Προσθήκη",
"pattern": "Μοτίβο",
"enable": "Ενεργοποιήστε",
"order": "Σειρά"
} }
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Anon mode", "anon_mode": "Anon mode",
"anon_mode_description": "Automatically use a different user ID in each thread", "anon_mode_description": "Automatically use a different user ID in each thread",
"pending": "Pending", "pending": "Pending",
"failed": "Failed" "failed": "Failed",
"add": "Add",
"pattern": "Pattern",
"enable": "Enable",
"order": "Order"
} }
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Modo anónimo", "anon_mode": "Modo anónimo",
"anon_mode_description": "Utiliza automáticamente un ID de usuario diferente en cada hilo", "anon_mode_description": "Utiliza automáticamente un ID de usuario diferente en cada hilo",
"pending": "Pendiente", "pending": "Pendiente",
"failed": "Fallido" "failed": "Fallido",
"add": "Añadir",
"pattern": "Patrón",
"enable": "Habilitar",
"order": "Orden"
} }
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "حالت ناشناس", "anon_mode": "حالت ناشناس",
"anon_mode_description": "به طور خودکار از یک شناسه کاربری متفاوت در هر موضوع استفاده کنید", "anon_mode_description": "به طور خودکار از یک شناسه کاربری متفاوت در هر موضوع استفاده کنید",
"pending": "در انتظار", "pending": "در انتظار",
"failed": "ناموفق" "failed": "ناموفق",
"add": "اضافه کردن",
"pattern": "الگو",
"enable": "فعال کردن",
"order": "ترتیب"
} }
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Anonyymi tila", "anon_mode": "Anonyymi tila",
"anon_mode_description": "Käytä automaattisesti eri käyttäjä-ID:tä jokaisessa keskustelussa", "anon_mode_description": "Käytä automaattisesti eri käyttäjä-ID:tä jokaisessa keskustelussa",
"pending": "Odottaa", "pending": "Odottaa",
"failed": "Epäonnistui" "failed": "Epäonnistui",
"add": "Lisää",
"pattern": "Malli",
"enable": "Ota käyttöön",
"order": "Järjestys"
} }
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Anong mode", "anon_mode": "Anong mode",
"anon_mode_description": "Awtomatikong gamitin ang ibang user ID sa bawat thread", "anon_mode_description": "Awtomatikong gamitin ang ibang user ID sa bawat thread",
"pending": "Naghihintay", "pending": "Naghihintay",
"failed": "Nabigo" "failed": "Nabigo",
"add": "Idagdag",
"pattern": "Pattern",
"enable": "I-enable",
"order": "Kaayusan"
} }
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Mode anonyme", "anon_mode": "Mode anonyme",
"anon_mode_description": "Utilisez automatiquement un identifiant utilisateur différent dans chaque fil", "anon_mode_description": "Utilisez automatiquement un identifiant utilisateur différent dans chaque fil",
"pending": "En attente", "pending": "En attente",
"failed": "Échoué" "failed": "Échoué",
"add": "Ajouter",
"pattern": "Modèle",
"enable": "Activer",
"order": "Ordre"
} }
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "מצב אנונימי", "anon_mode": "מצב אנונימי",
"anon_mode_description": "השתמש אוטומטית במזהה משתמש שונה בכל שרשור", "anon_mode_description": "השתמש אוטומטית במזהה משתמש שונה בכל שרשור",
"pending": "ממתין", "pending": "ממתין",
"failed": "נכשל" "failed": "נכשל",
"add": "הוסף",
"pattern": "תבנית",
"enable": "הפעל",
"order": "סדר"
} }
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "अनाम मोड", "anon_mode": "अनाम मोड",
"anon_mode_description": "प्रत्येक थ्रेड में स्वचालित रूप से एक अलग उपयोगकर्ता आईडी का उपयोग करें", "anon_mode_description": "प्रत्येक थ्रेड में स्वचालित रूप से एक अलग उपयोगकर्ता आईडी का उपयोग करें",
"pending": "लंबित", "pending": "लंबित",
"failed": "असफल" "failed": "असफल",
"add": "जोड़ें",
"pattern": "पैटर्न",
"enable": "सक्षम करें",
"order": "क्रम"
} }
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Anonim mód", "anon_mode": "Anonim mód",
"anon_mode_description": "Automatikusan használjon más felhasználói azonosítót minden szálban", "anon_mode_description": "Automatikusan használjon más felhasználói azonosítót minden szálban",
"pending": "Függőben", "pending": "Függőben",
"failed": "Sikertelen" "failed": "Sikertelen",
"add": "Hozzáad",
"pattern": "Minta",
"enable": "Engedélyez",
"order": "Rendelés"
} }
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Mode anonim", "anon_mode": "Mode anonim",
"anon_mode_description": "Secara otomatis gunakan ID pengguna yang berbeda di setiap utas", "anon_mode_description": "Secara otomatis gunakan ID pengguna yang berbeda di setiap utas",
"pending": "Tertunda", "pending": "Tertunda",
"failed": "Gagal" "failed": "Gagal",
"add": "Tambahkan",
"pattern": "Pola",
"enable": "Aktifkan",
"order": "Urutan"
} }
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Modalità anonima", "anon_mode": "Modalità anonima",
"anon_mode_description": "Usa automaticamente un ID utente diverso in ogni thread", "anon_mode_description": "Usa automaticamente un ID utente diverso in ogni thread",
"pending": "In attesa", "pending": "In attesa",
"failed": "Fallito" "failed": "Fallito",
"add": "Aggiungi",
"pattern": "Modello",
"enable": "Abilita",
"order": "Ordine"
} }
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "匿名モード", "anon_mode": "匿名モード",
"anon_mode_description": "各スレッドで自動的に異なるユーザーIDを使用します", "anon_mode_description": "各スレッドで自動的に異なるユーザーIDを使用します",
"pending": "保留中", "pending": "保留中",
"failed": "失敗" "failed": "失敗",
"add": "追加",
"pattern": "パターン",
"enable": "有効にする",
"order": "順序"
} }
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "익명 모드", "anon_mode": "익명 모드",
"anon_mode_description": "각 스레드에서 자동으로 다른 사용자 ID를 사용합니다", "anon_mode_description": "각 스레드에서 자동으로 다른 사용자 ID를 사용합니다",
"pending": "대기 중", "pending": "대기 중",
"failed": "실패" "failed": "실패",
"add": "추가",
"pattern": "패턴",
"enable": "사용",
"order": "순서"
} }
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "अनाम मोड", "anon_mode": "अनाम मोड",
"anon_mode_description": "प्रत्येक थ्रेडमध्ये स्वयंचलितपणे वेगळा वापरकर्ता ID वापरा", "anon_mode_description": "प्रत्येक थ्रेडमध्ये स्वयंचलितपणे वेगळा वापरकर्ता ID वापरा",
"pending": "प्रलंबित", "pending": "प्रलंबित",
"failed": "असफल" "failed": "असफल",
"add": "अॅड करा",
"pattern": "पॅटर्न",
"enable": "सक्षम करा",
"order": "आदेश"
} }
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Anoniem modus", "anon_mode": "Anoniem modus",
"anon_mode_description": "Gebruik automatisch een ander gebruikers-ID in elk thread", "anon_mode_description": "Gebruik automatisch een ander gebruikers-ID in elk thread",
"pending": "In afwachting", "pending": "In afwachting",
"failed": "Mislukt" "failed": "Mislukt",
"add": "Toevoegen",
"pattern": "Patroon",
"enable": "Inschakelen",
"order": "Volgorde"
} }
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Anonim modus", "anon_mode": "Anonim modus",
"anon_mode_description": "Bruk automatisk en annen bruker-ID i hver tråd", "anon_mode_description": "Bruk automatisk en annen bruker-ID i hver tråd",
"pending": "Venter", "pending": "Venter",
"failed": "Feilet" "failed": "Feilet",
"add": "Legg til",
"pattern": "Mønster",
"enable": "Aktiver",
"order": "Rekkefølge"
} }
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Tryb anonimowy", "anon_mode": "Tryb anonimowy",
"anon_mode_description": "Automatycznie używaj innego identyfikatora użytkownika w każdym wątku", "anon_mode_description": "Automatycznie używaj innego identyfikatora użytkownika w każdym wątku",
"pending": "Oczekujące", "pending": "Oczekujące",
"failed": "Nieudane" "failed": "Nieudane",
"add": "Dodaj",
"pattern": "Wzór",
"enable": "Włącz",
"order": "Kolejność"
} }
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Modo anônimo", "anon_mode": "Modo anônimo",
"anon_mode_description": "Use automaticamente um ID de usuário diferente em cada thread", "anon_mode_description": "Use automaticamente um ID de usuário diferente em cada thread",
"pending": "Pendente", "pending": "Pendente",
"failed": "Falhou" "failed": "Falhou",
"add": "Adicionar",
"pattern": "Padrão",
"enable": "Ativar",
"order": "Ordem"
} }
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Mod anonim", "anon_mode": "Mod anonim",
"anon_mode_description": "Utilizați automat un ID de utilizator diferit în fiecare fir", "anon_mode_description": "Utilizați automat un ID de utilizator diferit în fiecare fir",
"pending": "În așteptare", "pending": "În așteptare",
"failed": "Eșuat" "failed": "Eșuat",
"add": "Adaugă",
"pattern": "Model",
"enable": "Activare",
"order": "Ordine"
} }
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Анонимный режим", "anon_mode": "Анонимный режим",
"anon_mode_description": "Автоматически используйте другой идентификатор пользователя в каждом потоке", "anon_mode_description": "Автоматически используйте другой идентификатор пользователя в каждом потоке",
"pending": "В ожидании", "pending": "В ожидании",
"failed": "Не удалось" "failed": "Не удалось",
"add": "Добавить",
"pattern": "Шаблон",
"enable": "Включить",
"order": "Порядок"
} }
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Mënyra anonime", "anon_mode": "Mënyra anonime",
"anon_mode_description": "Përdorni automatikisht një ID përdoruesi të ndryshëm në çdo temë", "anon_mode_description": "Përdorni automatikisht një ID përdoruesi të ndryshëm në çdo temë",
"pending": "Në pritje", "pending": "Në pritje",
"failed": "Dështuar" "failed": "Dështuar",
"add": "Shto",
"pattern": "Model",
"enable": "Aktivizo",
"order": "Rendit"
} }
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Anonymt läge", "anon_mode": "Anonymt läge",
"anon_mode_description": "Använd automatiskt ett annat användar-ID i varje tråd", "anon_mode_description": "Använd automatiskt ett annat användar-ID i varje tråd",
"pending": "Väntande", "pending": "Väntande",
"failed": "Misslyckades" "failed": "Misslyckades",
"add": "Lägg till",
"pattern": "Mönster",
"enable": "Aktivera",
"order": "Ordning"
} }
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "అనానిమస్ మోడ్", "anon_mode": "అనానిమస్ మోడ్",
"anon_mode_description": "ప్రతి థ్రెడ్లో ఆటోమేటిక్‌గా ఒక వేరు వినియోగదారుడి ID ఉపయోగించండి", "anon_mode_description": "ప్రతి థ్రెడ్లో ఆటోమేటిక్‌గా ఒక వేరు వినియోగదారుడి ID ఉపయోగించండి",
"pending": "అనుమతించబడాలి", "pending": "అనుమతించబడాలి",
"failed": "విజయవంతం కాలేదు" "failed": "విజయవంతం కాలేదు",
"add": "చేర్చండి",
"pattern": "ప్యాటర్న్",
"enable": "చేర్చు",
"order": "ఆర్డర్"
} }
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "โหมดนิรนาม", "anon_mode": "โหมดนิรนาม",
"anon_mode_description": "ใช้ ID ผู้ใช้ที่แตกต่างกันโดยอัตโนมัติในแต่ละเธรด", "anon_mode_description": "ใช้ ID ผู้ใช้ที่แตกต่างกันโดยอัตโนมัติในแต่ละเธรด",
"pending": "รอดำเนินการ", "pending": "รอดำเนินการ",
"failed": "ล้มเหลว" "failed": "ล้มเหลว",
"add": "เพิ่ม",
"pattern": "รูปแบบ",
"enable": "เปิดใช้งาน",
"order": "ลำดับ"
} }
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Gizli mod", "anon_mode": "Gizli mod",
"anon_mode_description": "Her iplikte otomatik olarak farklı bir kullanıcı ID'si kullanın", "anon_mode_description": "Her iplikte otomatik olarak farklı bir kullanıcı ID'si kullanın",
"pending": "Beklemede", "pending": "Beklemede",
"failed": "Başarısız" "failed": "Başarısız",
"add": "Ekle",
"pattern": "Desen",
"enable": "Etkinleştir",
"order": "Sıra"
} }
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Режим анонімності", "anon_mode": "Режим анонімності",
"anon_mode_description": "Автоматично використовуйте інший ідентифікатор користувача в кожній гілці", "anon_mode_description": "Автоматично використовуйте інший ідентифікатор користувача в кожній гілці",
"pending": "Очікує", "pending": "Очікує",
"failed": "Не вдалося" "failed": "Не вдалося",
"add": "Додати",
"pattern": "Шаблон",
"enable": "Увімкнути",
"order": "Порядок"
} }
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "خفیہ موڈ", "anon_mode": "خفیہ موڈ",
"anon_mode_description": "ہر تھریڈ میں خود بخود مختلف صارف آئی ڈی کا استعمال کریں", "anon_mode_description": "ہر تھریڈ میں خود بخود مختلف صارف آئی ڈی کا استعمال کریں",
"pending": "منتظر", "pending": "منتظر",
"failed": "ناکام" "failed": "ناکام",
"add": "شامل کریں",
"pattern": "نمونہ",
"enable": "فعال کریں",
"order": "ترتیب"
} }
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "Chế độ ẩn danh", "anon_mode": "Chế độ ẩn danh",
"anon_mode_description": "Tự động sử dụng ID người dùng khác nhau trong mỗi chủ đề", "anon_mode_description": "Tự động sử dụng ID người dùng khác nhau trong mỗi chủ đề",
"pending": "Đang chờ", "pending": "Đang chờ",
"failed": "Thất bại" "failed": "Thất bại",
"add": "Thêm",
"pattern": "Mẫu",
"enable": "Kích hoạt",
"order": "Thứ tự"
} }
+5 -1
View File
@@ -226,5 +226,9 @@
"anon_mode": "匿名模式", "anon_mode": "匿名模式",
"anon_mode_description": "在每个线程中自动使用不同的用户 ID", "anon_mode_description": "在每个线程中自动使用不同的用户 ID",
"pending": "待处理", "pending": "待处理",
"failed": "失败" "failed": "失败",
"add": "添加",
"pattern": "模式",
"enable": "启用",
"order": "顺序"
} }
@@ -18,12 +18,16 @@
.settingsModal input[type='text'] { .settingsModal input[type='text'] {
outline: none; outline: none;
border: 1px solid #aaa; border: var(--reply-modal-field-input-border, revert);
padding: 2px 4px 3px; padding: 2px 4px 3px;
} }
.settingsModal textarea {
border: var(--reply-modal-field-input-border, revert) !important;
}
.settingsModal input[type="text"]:focus, .settingsModal textarea:focus { .settingsModal input[type="text"]:focus, .settingsModal textarea:focus {
border: var(--reply-modal-field-input-border-focus, revert); border: var(--reply-modal-field-input-border-focus, revert) !important;
} }
.settingsModal { .settingsModal {
+1 -1
View File
@@ -63,7 +63,7 @@ const useCatalogFeedRows = (columnCount: number, feed: any, isFeedLoaded: boolea
} }
// add subplebbit description and rules as fake posts at the top of the feed // add subplebbit description and rules as fake posts at the top of the feed
if ((description && description.length > 0 && (showTextOnlyThreads || (!showTextOnlyThreads && suggested?.avatarUrl))) || isInAllView) { if ((description && description.length > 0 && (showTextOnlyThreads || (!showTextOnlyThreads && suggested?.avatarUrl))) || (isInAllView && showTextOnlyThreads)) {
_feed.unshift({ _feed.unshift({
isDescription: true, isDescription: true,
subplebbitAddress: address, subplebbitAddress: address,
+37 -17
View File
@@ -1,4 +1,10 @@
import { create } from 'zustand'; import { create } from 'zustand';
import { persist } from 'zustand/middleware';
interface FilterItem {
text: string;
enabled: boolean;
}
interface CatalogFiltersStore { interface CatalogFiltersStore {
showAdultBoards: boolean; showAdultBoards: boolean;
@@ -7,24 +13,38 @@ interface CatalogFiltersStore {
setShowGoreBoards: (value: boolean) => void; setShowGoreBoards: (value: boolean) => void;
showTextOnlyThreads: boolean; showTextOnlyThreads: boolean;
setShowTextOnlyThreads: (value: boolean) => void; setShowTextOnlyThreads: (value: boolean) => void;
filterText: string;
setFilterText: (value: string) => void;
filterItems: FilterItem[];
setFilterItems: (items: FilterItem[]) => void; // New method to set all filter items at once
saveAndApplyFilters: (items: FilterItem[]) => void; // Updated to accept items
} }
const useCatalogFiltersStore = create<CatalogFiltersStore>((set) => ({ const useCatalogFiltersStore = create(
showTextOnlyThreads: localStorage.getItem('showTextOnlyThreads') === 'true' ? true : false, persist<CatalogFiltersStore>(
setShowTextOnlyThreads: (value: boolean) => { (set) => ({
set({ showTextOnlyThreads: value }); showTextOnlyThreads: false,
localStorage.setItem('showTextOnlyThreads', value.toString()); setShowTextOnlyThreads: (value: boolean) => set({ showTextOnlyThreads: value }),
}, showAdultBoards: false,
showAdultBoards: localStorage.getItem('showAdultBoards') === 'true' ? true : false, setShowAdultBoards: (value: boolean) => set({ showAdultBoards: value }),
setShowAdultBoards: (value: boolean) => { showGoreBoards: false,
set({ showAdultBoards: value }); setShowGoreBoards: (value: boolean) => set({ showGoreBoards: value }),
localStorage.setItem('showAdultBoards', value.toString()); filterText: '',
}, setFilterText: (value: string) => set({ filterText: value }),
showGoreBoards: localStorage.getItem('showGoreBoards') === 'true' ? true : false, filterItems: [],
setShowGoreBoards: (value: boolean) => { setFilterItems: (items: FilterItem[]) => {
set({ showGoreBoards: value }); const nonEmptyItems = items.filter((item) => item.text.trim() !== '');
localStorage.setItem('showGoreBoards', value.toString()); set({ filterItems: nonEmptyItems });
}, },
})); saveAndApplyFilters: (items: FilterItem[]) => {
const nonEmptyItems = items.filter((item) => item.text.trim() !== '');
set({ filterItems: nonEmptyItems });
},
}),
{
name: 'catalog-filters-storage',
},
),
);
export default useCatalogFiltersStore; export default useCatalogFiltersStore;
@@ -84,7 +84,7 @@
} }
.filters label { .filters label {
display: block; display: inline-block;
margin-bottom: 7px; margin-bottom: 7px;
} }
@@ -101,3 +101,66 @@
.paddingBottom { .paddingBottom {
padding-bottom: 5px; padding-bottom: 5px;
} }
.saveButton {
margin-left: 5px;
}
.filtersTable {
width: 100%;
border-spacing: 1px;
margin-left: auto;
margin-right: auto;
padding: 10px 2px 2px 2px;
}
.filtersTable th {
text-align: center;
font-weight: 700;
font-size: 11px;
min-width: 20px;
}
.filtersTable tbody td {
padding: 8px 0 0;
}
.filtersTable td {
text-align: center;
margin: 0;
font-size: 10pt;
}
.filtersTable input[type='checkbox'] {
display: inline-block;
margin: auto;
}
.filtersTable input[type='text'] {
margin: 0 2px;
padding: 1px;
outline: none;
border: var(--reply-modal-field-input-border, revert);
font-size: 11px;
width: 200px;
}
.filtersTable input[type='text']:focus {
border: var(--reply-modal-field-input-border-focus, revert);
}
.filtersTable span {
cursor: pointer;
}
.filtersTable tfoot td {
padding-top: 20px;
}
.addButton {
float: left;
}
.saveButton {
float: right;
}
@@ -1,10 +1,102 @@
import { useState } from 'react'; import { useState, useCallback } from 'react';
import { useLocation, useParams } from 'react-router-dom'; import { useLocation, useParams } from 'react-router-dom';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { isAllView, isCatalogView } from '../../../lib/utils/view-utils'; import { isAllView, isCatalogView } from '../../../lib/utils/view-utils';
import useCatalogFiltersStore from '../../../stores/use-catalog-filters-store'; import useCatalogFiltersStore from '../../../stores/use-catalog-filters-store';
import styles from './catalog-filters.module.css'; import styles from './catalog-filters.module.css';
const FiltersTable = () => {
const { t } = useTranslation();
const { filterItems, saveAndApplyFilters } = useCatalogFiltersStore();
const [localFilterItems, setLocalFilterItems] = useState(filterItems);
const handleAddFilter = useCallback(() => {
setLocalFilterItems((prev) => [...prev, { text: '', enabled: true }]);
}, []);
const handleSave = useCallback(() => {
const nonEmptyFilters = localFilterItems.filter((item) => item.text.trim() !== '');
saveAndApplyFilters(nonEmptyFilters);
}, [saveAndApplyFilters, localFilterItems]);
const updateLocalFilterItem = useCallback((index: number, item: any) => {
setLocalFilterItems((prev) => prev.map((f, i) => (i === index ? item : f)));
}, []);
const removeLocalFilterItem = useCallback((index: number) => {
setLocalFilterItems((prev) => prev.filter((_, i) => i !== index));
}, []);
const moveLocalFilterItemUp = useCallback((index: number) => {
if (index === 0) return;
setLocalFilterItems((prev) => {
const newItems = [...prev];
[newItems[index - 1], newItems[index]] = [newItems[index], newItems[index - 1]];
return newItems;
});
}, []);
return (
<table className={styles.filtersTable}>
<thead>
<tr>
<th>{t('order')}</th>
<th>{t('enable')}</th>
<th>{t('pattern')}</th>
<th>{t('delete')}</th>
</tr>
</thead>
<tbody>
{localFilterItems.map((item, index) => (
<tr key={index}>
<td>
<span className={styles.orderButton} onClick={() => moveLocalFilterItemUp(index)}>
</span>
</td>
<td>
<input
type='checkbox'
className={styles.onCheckbox}
checked={item.enabled}
onChange={(e) => updateLocalFilterItem(index, { ...item, enabled: e.target.checked })}
/>
</td>
<td>
<input
type='text'
autoCorrect='off'
autoComplete='off'
spellCheck='false'
value={item.text}
onChange={(e) => updateLocalFilterItem(index, { ...item, text: e.target.value })}
/>
</td>
<td>
<span className={styles.deleteButton} onClick={() => removeLocalFilterItem(index)}>
×
</span>
</td>
</tr>
))}
</tbody>
<tfoot>
<tr>
<td colSpan={4}>
<button className={styles.addButton} onClick={handleAddFilter}>
{t('add')}
</button>
<button className={styles.saveButton} onClick={handleSave}>
{t('save')}
</button>
</td>
</tr>
</tfoot>
</table>
);
};
const FiltersModal = ({ closeModal }: { closeModal: () => void }) => { const FiltersModal = ({ closeModal }: { closeModal: () => void }) => {
const { t } = useTranslation(); const { t } = useTranslation();
const { showAdultBoards, setShowAdultBoards, showGoreBoards, setShowGoreBoards, showTextOnlyThreads, setShowTextOnlyThreads } = useCatalogFiltersStore(); const { showAdultBoards, setShowAdultBoards, showGoreBoards, setShowGoreBoards, showTextOnlyThreads, setShowTextOnlyThreads } = useCatalogFiltersStore();
@@ -23,25 +115,31 @@ const FiltersModal = ({ closeModal }: { closeModal: () => void }) => {
</div> </div>
<div className={styles.filters}> <div className={styles.filters}>
{isInCatalogView && ( {isInCatalogView && (
<label className={`${styles.paddingBottom} capitalize`}> <div>
<input type='checkbox' checked={!showTextOnlyThreads} onChange={(e) => setShowTextOnlyThreads(!e.target.checked)} /> <label className='capitalize'>
{t('hide_threads_without_images')} <input type='checkbox' checked={!showTextOnlyThreads} onChange={(e) => setShowTextOnlyThreads(!e.target.checked)} />
</label> {t('hide_threads_without_images')}
)}
{isInAllView && (
<div className={styles.nsfwLabels}>
<div className={styles.categoryTitle}>{t('nsfw_boards')}</div>
<label>
<input type='checkbox' checked={!showGoreBoards} onChange={(e) => setShowGoreBoards(!e.target.checked)} />
{t('hide_gore_boards')}
</label>
<label>
<input type='checkbox' checked={!showAdultBoards} onChange={(e) => setShowAdultBoards(!e.target.checked)} />
{t('hide_adult_boards')}
</label> </label>
</div> </div>
)} )}
{isInAllView && (
<div className={styles.nsfwLabels}>
<div>
<label>
<input type='checkbox' checked={!showGoreBoards} onChange={(e) => setShowGoreBoards(!e.target.checked)} />
hide gore content
</label>
</div>
<div>
<label>
<input type='checkbox' checked={!showAdultBoards} onChange={(e) => setShowAdultBoards(!e.target.checked)} />
hide adult content
</label>
</div>
</div>
)}
</div> </div>
{isInCatalogView && <FiltersTable />}
</div> </div>
</> </>
); );
+29 -9
View File
@@ -21,12 +21,25 @@ import styles from './catalog.module.css';
const lastVirtuosoStates: { [key: string]: StateSnapshot } = {}; const lastVirtuosoStates: { [key: string]: StateSnapshot } = {};
const catalogFilter = (comment: Comment) => { const threadsWithImagesFilter = (comment: Comment) => {
const commentMediaInfo = getCommentMediaInfo(comment); const commentMediaInfo = getCommentMediaInfo(comment);
const hasThumbnail = getHasThumbnail(commentMediaInfo, comment?.link); const hasThumbnail = getHasThumbnail(commentMediaInfo, comment?.link);
return hasThumbnail; return hasThumbnail;
}; };
const textFilter = (comment: Comment, filterItems: any[]) => {
if (!filterItems) return true;
if (filterItems.length === 0) return true;
const titleLower = comment?.title?.toLowerCase() || '';
const contentLower = comment?.content?.toLowerCase() || '';
return filterItems.every((item) => {
if (!item.enabled) return true;
const pattern = item.text.toLowerCase();
return !(titleLower.includes(pattern) || contentLower.includes(pattern));
});
};
const Catalog = () => { const Catalog = () => {
const { t } = useTranslation(); const { t } = useTranslation();
const location = useLocation(); const location = useLocation();
@@ -34,7 +47,7 @@ const Catalog = () => {
const isInAllView = isAllView(location.pathname, useParams()); const isInAllView = isAllView(location.pathname, useParams());
const defaultSubplebbits = useDefaultSubplebbits(); const defaultSubplebbits = useDefaultSubplebbits();
const { showAdultBoards, showGoreBoards } = useCatalogFiltersStore(); const { showAdultBoards, showGoreBoards, showTextOnlyThreads, filterItems } = useCatalogFiltersStore();
const account = useAccount(); const account = useAccount();
const subscriptions = account?.subscriptions; const subscriptions = account?.subscriptions;
@@ -72,15 +85,22 @@ const Catalog = () => {
const postsPerPage = useMemo(() => (columnCount <= 2 ? 10 : columnCount === 3 ? 15 : columnCount === 4 ? 20 : 25), []); const postsPerPage = useMemo(() => (columnCount <= 2 ? 10 : columnCount === 3 ? 15 : columnCount === 4 ? 20 : 25), []);
const { timeFilterSeconds } = useTimeFilter(); const { timeFilterSeconds } = useTimeFilter();
const { showTextOnlyThreads } = useCatalogFiltersStore();
const { sortType } = useSortingStore(); const { sortType } = useSortingStore();
const feedOptions: any = { const feedOptions: any = useMemo(
subplebbitAddresses, () => ({
sortType, subplebbitAddresses,
postsPerPage: isInAllView || isInSubscriptionsView ? 10 : postsPerPage, sortType,
filter: !showTextOnlyThreads && catalogFilter, postsPerPage: isInAllView || isInSubscriptionsView ? 10 : postsPerPage,
}; filter: (comment: Comment) => {
if (!showTextOnlyThreads && !threadsWithImagesFilter(comment)) {
return false;
}
return textFilter(comment, filterItems);
},
}),
[subplebbitAddresses, sortType, isInAllView, isInSubscriptionsView, postsPerPage, showTextOnlyThreads, filterItems],
);
if (isInAllView || isInSubscriptionsView) { if (isInAllView || isInSubscriptionsView) {
feedOptions.newerThan = timeFilterSeconds; feedOptions.newerThan = timeFilterSeconds;
+1
View File
@@ -328,6 +328,7 @@
.postMobile .postMessage { .postMobile .postMessage {
padding: 10px; padding: 10px;
font-size: var(--post-mobile-content-font-size); font-size: var(--post-mobile-content-font-size);
word-break: break-word;
} }
.postMobile .postLink { .postMobile .postLink {