From 95fb768b5a1200cd3e4317c54293b46aea9c8655 Mon Sep 17 00:00:00 2001
From: Shpuld Shpludson <shp@cock.li>
Date: Wed, 27 Feb 2019 14:38:58 +0000
Subject: [PATCH] Fix #399 Make max attachments configurable

---
 src/components/settings/settings.js  | 5 +++++
 src/components/settings/settings.vue | 8 ++++++++
 src/components/status/status.js      | 8 +++++---
 src/i18n/en.json                     | 1 +
 src/i18n/fi.json                     | 1 +
 src/modules/config.js                | 1 +
 6 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/src/components/settings/settings.js b/src/components/settings/settings.js
index 23c1acdb..6e2dff7b 100644
--- a/src/components/settings/settings.js
+++ b/src/components/settings/settings.js
@@ -12,6 +12,7 @@ const settings = {
     return {
       hideAttachmentsLocal: user.hideAttachments,
       hideAttachmentsInConvLocal: user.hideAttachmentsInConv,
+      maxThumbnails: user.maxThumbnails,
       hideNsfwLocal: user.hideNsfw,
       useOneClickNsfw: user.useOneClickNsfw,
       hideISPLocal: user.hideISP,
@@ -186,6 +187,10 @@ const settings = {
     },
     useContainFit (value) {
       this.$store.dispatch('setOption', { name: 'useContainFit', value })
+    },
+    maxThumbnails (value) {
+      value = this.maxThumbnails = Math.floor(Math.max(value, 0))
+      this.$store.dispatch('setOption', { name: 'maxThumbnails', value })
     }
   }
 }
diff --git a/src/components/settings/settings.vue b/src/components/settings/settings.vue
index f5e00995..16814f65 100644
--- a/src/components/settings/settings.vue
+++ b/src/components/settings/settings.vue
@@ -136,6 +136,10 @@
               <input type="checkbox" id="hideAttachmentsInConv" v-model="hideAttachmentsInConvLocal">
               <label for="hideAttachmentsInConv">{{$t('settings.hide_attachments_in_convo')}}</label>
             </li>
+            <li>
+              <label for="maxThumbnails">{{$t('settings.max_thumbnails')}}</label>
+              <input class="number-input" type="number" id="maxThumbnails" v-model.number="maxThumbnails" min="0" step="1">
+            </li>
             <li>
               <input type="checkbox" id="hideNsfw" v-model="hideNsfwLocal">
               <label for="hideNsfw">{{$t('settings.nsfw_clickthrough')}}</label>
@@ -316,6 +320,10 @@
     min-width: 10em;
     padding: 0 2em;
   }
+
+  .number-input {
+    max-width: 6em;
+  }
 }
 .select-multiple {
   display: flex;
diff --git a/src/components/status/status.js b/src/components/status/status.js
index 0273a5be..fab2fe62 100644
--- a/src/components/status/status.js
+++ b/src/components/status/status.js
@@ -40,8 +40,7 @@ const Status = {
       expandingSubject: typeof this.$store.state.config.collapseMessageWithSubject === 'undefined'
         ? !this.$store.state.instance.collapseMessageWithSubject
         : !this.$store.state.config.collapseMessageWithSubject,
-      betterShadow: this.$store.state.interface.browserSupport.cssFilter,
-      maxAttachments: 9
+      betterShadow: this.$store.state.interface.browserSupport.cssFilter
     }
   },
   computed: {
@@ -225,7 +224,7 @@ const Status = {
     attachmentSize () {
       if ((this.$store.state.config.hideAttachments && !this.inConversation) ||
         (this.$store.state.config.hideAttachmentsInConv && this.inConversation) ||
-        (this.status.attachments.length > this.maxAttachments)) {
+        (this.status.attachments.length > this.maxThumbnails)) {
         return 'hide'
       } else if (this.compact) {
         return 'small'
@@ -249,6 +248,9 @@ const Status = {
       return this.status.attachments.filter(
         file => !fileType.fileMatchesSomeType(this.galleryTypes, file)
       )
+    },
+    maxThumbnails () {
+      return this.$store.state.config.maxThumbnails
     }
   },
   components: {
diff --git a/src/i18n/en.json b/src/i18n/en.json
index 64753f1d..8e837d2f 100644
--- a/src/i18n/en.json
+++ b/src/i18n/en.json
@@ -149,6 +149,7 @@
     "general": "General",
     "hide_attachments_in_convo": "Hide attachments in conversations",
     "hide_attachments_in_tl": "Hide attachments in timeline",
+    "max_thumbnails": "Maximum amount of thumbnails per post",
     "hide_isp": "Hide instance-specific panel",
     "preload_images": "Preload images",
     "use_one_click_nsfw": "Open NSFW attachments with just one click",
diff --git a/src/i18n/fi.json b/src/i18n/fi.json
index 5a0c1ea8..a8259ca8 100644
--- a/src/i18n/fi.json
+++ b/src/i18n/fi.json
@@ -133,6 +133,7 @@
     "general": "Yleinen",
     "hide_attachments_in_convo": "Piilota liitteet keskusteluissa",
     "hide_attachments_in_tl": "Piilota liitteet aikajanalla",
+    "max_thumbnails": "Suurin sallittu määrä liitteitä esikatselussa",
     "hide_isp": "Piilota palvelimenkohtainen ruutu",
     "preload_images": "Esilataa kuvat",
     "use_one_click_nsfw": "Avaa NSFW-liitteet yhdellä painalluksella",
diff --git a/src/modules/config.js b/src/modules/config.js
index 71f71376..1c30c203 100644
--- a/src/modules/config.js
+++ b/src/modules/config.js
@@ -8,6 +8,7 @@ const defaultState = {
   collapseMessageWithSubject: undefined, // instance default
   hideAttachments: false,
   hideAttachmentsInConv: false,
+  maxThumbnails: 16,
   hideNsfw: true,
   preloadImage: true,
   loopVideo: true,