From 10b62f9bd24a154b7c99cbdb8abe9fb55c4aef2c Mon Sep 17 00:00:00 2001
From: Moritz Strohm <strohm@data-quest.de>
Date: Fri, 19 Aug 2022 20:04:29 +0000
Subject: [PATCH] Show object count for folders, closes #1392

Closes #1392

Merge request studip/studip!887
---
 .../5.3.1_add_show_folder_size_config.php     | 32 +++++++++++++++++++
 lib/filesystem/FilesystemVueDataManager.php   |  4 +++
 resources/vue/base-components.js              |  2 ++
 resources/vue/components/FilesTable.vue       |  5 ++-
 resources/vue/components/StudipFolderSize.vue | 24 ++++++++++++++
 5 files changed, 66 insertions(+), 1 deletion(-)
 create mode 100644 db/migrations/5.3.1_add_show_folder_size_config.php
 create mode 100644 resources/vue/components/StudipFolderSize.vue

diff --git a/db/migrations/5.3.1_add_show_folder_size_config.php b/db/migrations/5.3.1_add_show_folder_size_config.php
new file mode 100644
index 00000000000..fe45a4cc401
--- /dev/null
+++ b/db/migrations/5.3.1_add_show_folder_size_config.php
@@ -0,0 +1,32 @@
+<?php
+
+
+class AddShowFolderSizeConfig extends Migration
+{
+    public function description()
+    {
+        return 'Adds the configuration SHOW_FOLDER_SIZE.';
+    }
+
+
+    protected function up()
+    {
+        DBManager::get()->exec(
+            "INSERT IGNORE INTO `config`
+            (`field`, `value`, `type`, `range`,
+            `section`, `mkdate`, `chdate`,
+            `description`)
+            VALUES
+            ('SHOW_FOLDER_SIZE', '1', 'boolean', 'global',
+            'files', UNIX_TIMESTAMP(), UNIX_TIMESTAMP(),
+            'SHOW_FOLDER_SIZE gibt an, ob die Anzahl der Objekte (Dateien und Unterordner) in einem Ordner angezeigt werden sollen.')"
+        );
+    }
+
+    protected function down()
+    {
+        DBManager::get()->exec(
+            "DELETE FROM `config_values` WHERE `field` = 'SHOW_FOLDER_SIZE'"
+        );
+    }
+}
diff --git a/lib/filesystem/FilesystemVueDataManager.php b/lib/filesystem/FilesystemVueDataManager.php
index 84fbedb7282..9054de628a3 100644
--- a/lib/filesystem/FilesystemVueDataManager.php
+++ b/lib/filesystem/FilesystemVueDataManager.php
@@ -133,6 +133,10 @@ class FilesystemVueDataManager
             'name' => $folder->name,
             'url' => URLHelper::getURL('dispatch.php/' . $controllerpath . '/' . $folder->getId()),
             'user_id' => $folder->user_id,
+            'object_count' => (Config::get()->SHOW_FOLDER_SIZE
+                ? count($folder->getFiles()) + count($folder->getSubfolders())
+                : 0
+            ),
             'author_name' => $folder->owner ? $folder->owner->getFullname('no_title_rev') : '',
             'author_url' => $folder->owner && $folder->owner->id !== $GLOBALS['user']->id? URLHelper::getURL('dispatch.php/profile', ['username' => $folder->owner->username]) : '',
             'chdate' => (int) $folder->chdate,
diff --git a/resources/vue/base-components.js b/resources/vue/base-components.js
index 97231d2827d..09dbac3fb54 100644
--- a/resources/vue/base-components.js
+++ b/resources/vue/base-components.js
@@ -7,6 +7,7 @@ import StudipAssetImg from './components/StudipAssetImg.vue';
 import StudipDateTime from './components/StudipDateTime.vue';
 import StudipDialog from './components/StudipDialog.vue';
 import StudipFileSize from './components/StudipFileSize.vue';
+import StudipFolderSize from './components/StudipFolderSize.vue';
 import StudipIcon from './components/StudipIcon.vue';
 import RangeInput from './components/RangeInput.vue';
 import Datetimepicker from './components/Datetimepicker.vue';
@@ -31,6 +32,7 @@ const BaseComponents = {
     Datetimepicker,
     StudipDialog,
     StudipFileSize,
+    StudipFolderSize,
     StudipIcon,
     I18nTextarea,
 //    StudipLoadingIndicator,
diff --git a/resources/vue/components/FilesTable.vue b/resources/vue/components/FilesTable.vue
index 88abdeca723..15f2d49802f 100644
--- a/resources/vue/components/FilesTable.vue
+++ b/resources/vue/components/FilesTable.vue
@@ -130,7 +130,10 @@
                             <span v-html="highlightString(folder.name)"></span>
                         </a>
                     </td>
-                    <td class="responsive-hidden"></td>
+                    <td class="responsive-hidden" :data-sort-value="folder.object_count">
+                        <studip-folder-size v-if="folder.object_count"
+                                            :object_count="folder.object_count"></studip-folder-size>
+                    </td>
                     <td v-if="showdownloads"
                         class="responsive-hidden">
                     </td>
diff --git a/resources/vue/components/StudipFolderSize.vue b/resources/vue/components/StudipFolderSize.vue
new file mode 100644
index 00000000000..0c6e0bc6d12
--- /dev/null
+++ b/resources/vue/components/StudipFolderSize.vue
@@ -0,0 +1,24 @@
+<template>
+    <span>{{ folder_size }}</span>
+</template>
+
+<script>
+export default {
+    name: 'studip-folder-size',
+    props: {
+        object_count: Number
+    },
+    computed: {
+        folder_size() {
+            if (this.object_count < 1) {
+                return '';
+            }
+
+            return this.$gettextInterpolate(
+                this.$ngettext('%{count} Objekt', '%{count} Objekte', this.object_count),
+                {count: this.object_count}
+            );
+        }
+    }
+}
+</script>
-- 
GitLab