1414use Chamilo \CoreBundle \Entity \ResourceShowCourseResourcesInSessionInterface ;
1515use Chamilo \CoreBundle \Entity \Session ;
1616use Chamilo \CoreBundle \Repository \ResourceLinkRepository ;
17+ use Chamilo \CoreBundle \Settings \SettingsManager ;
1718use Chamilo \CourseBundle \Entity \CDocument ;
1819use Chamilo \CourseBundle \Entity \CGroup ;
1920use Doctrine \ORM \EntityManagerInterface ;
@@ -27,6 +28,7 @@ final class DocumentCollectionStateProvider implements ProviderInterface
2728 public function __construct (
2829 private readonly EntityManagerInterface $ entityManager ,
2930 private readonly RequestStack $ requestStack ,
31+ private readonly SettingsManager $ settingsManager ,
3032 ) {}
3133
3234 /**
@@ -68,6 +70,10 @@ public function provide(Operation $operation, array $uriVariables = [], array $c
6870
6971 // Gradebook mode (e.g. gradebook=1)
7072 $ isGradebook = !empty ($ query ['gradebook ' ]) && 1 === (int ) $ query ['gradebook ' ];
73+ $ showUsersFolders = 'true ' === (string ) ($ this ->settingsManager ->getSetting ('document.show_users_folders ' , true ) ?? '' );
74+ $ showDefaultFolders = 'false ' !== (string ) ($ this ->settingsManager ->getSetting ('document.show_default_folders ' , true ) ?? '' );
75+ $ showChatFolder = 'true ' === (string ) ($ this ->settingsManager ->getSetting ('chat.show_chat_folder ' , true ) ?? '' );
76+
7177 $ rawFiletype = $ query ['filetype ' ] ?? null ;
7278 $ filetypes = [];
7379
@@ -78,21 +84,32 @@ public function provide(Operation $operation, array $uriVariables = [], array $c
7884 }
7985
8086 // Normalize & unique
81- $ filetypes = array_values (array_unique (array_filter (array_map ('strval ' , $ filetypes ))));
87+ $ requestedFiletypes = array_values (array_unique (array_filter (array_map ('strval ' , $ filetypes ))));
8288
8389 // Compatibility: treat "html" as a subtype of "file"
84- if (\in_array ('file ' , $ filetypes , true ) && !\in_array ('html ' , $ filetypes , true )) {
85- $ filetypes [] = 'html ' ;
90+ $ effectiveFiletypes = $ requestedFiletypes ;
91+ if (\in_array ('file ' , $ effectiveFiletypes , true ) && !\in_array ('html ' , $ effectiveFiletypes , true )) {
92+ $ effectiveFiletypes [] = 'html ' ;
93+ }
94+
95+ // System folder subtypes
96+ $ systemFolderTypes = ['user_folder ' , 'user_folder_ses ' , 'media_folder ' , 'chat_folder ' , 'cert_folder ' ];
97+
98+ // If the client asks for "folder", include system folder subtypes as well.
99+ // This keeps folder browsing working after migration (system folders have custom filetypes).
100+ if (\in_array ('folder ' , $ effectiveFiletypes , true )) {
101+ $ effectiveFiletypes = array_values (array_unique (array_merge ($ effectiveFiletypes , $ systemFolderTypes )));
86102 }
87103
88- if (!empty ($ filetypes )) {
104+ if (!empty ($ effectiveFiletypes )) {
89105 $ qb
90106 ->andWhere ($ qb ->expr ()->in ('d.filetype ' , ':filetypes ' ))
91- ->setParameter ('filetypes ' , $ filetypes )
107+ ->setParameter ('filetypes ' , $ effectiveFiletypes )
92108 ;
93109 }
94110
95- $ wantsCertificateList = \in_array ('certificate ' , $ filetypes , true );
111+ // NOTE: this is for "certificate" filetype lists, not the certificates folder filetype.
112+ $ wantsCertificateList = \in_array ('certificate ' , $ effectiveFiletypes , true );
96113 $ showSystemCertificates = !empty ($ query ['showSystemCertificates ' ]) && 1 === (int ) $ query ['showSystemCertificates ' ];
97114
98115 if (!$ showSystemCertificates && !($ isGradebook && $ wantsCertificateList )) {
@@ -105,6 +122,45 @@ public function provide(Operation $operation, array $uriVariables = [], array $c
105122 }
106123 }
107124
125+ // Hide system folders depending on settings.
126+ $ explicitSystemTypes = array_values (array_intersect ($ requestedFiletypes , $ systemFolderTypes ));
127+ $ hiddenSystemTypes = [];
128+
129+ // User folders
130+ if (!$ showUsersFolders ) {
131+ $ hiddenSystemTypes [] = 'user_folder ' ;
132+ $ hiddenSystemTypes [] = 'user_folder_ses ' ;
133+ } else {
134+ // When enabled, never show session-scoped shared folders in base course context.
135+ if ($ sid <= 0 ) {
136+ $ hiddenSystemTypes [] = 'user_folder_ses ' ;
137+ }
138+ }
139+
140+ // Default media folders
141+ if (!$ showDefaultFolders ) {
142+ $ hiddenSystemTypes [] = 'media_folder ' ;
143+ }
144+
145+ // Chat history folder (controlled by chat.show_chat_folder)
146+ if (!$ showChatFolder ) {
147+ $ hiddenSystemTypes [] = 'chat_folder ' ;
148+ }
149+
150+ // Certificates folder: hide unless explicitly requested.
151+ if (!$ showSystemCertificates && !($ isGradebook && $ wantsCertificateList )) {
152+ $ hiddenSystemTypes [] = 'cert_folder ' ;
153+ }
154+
155+ $ hiddenSystemTypes = array_values (array_unique (array_diff ($ hiddenSystemTypes , $ explicitSystemTypes )));
156+
157+ if (!empty ($ hiddenSystemTypes )) {
158+ $ qb
159+ ->andWhere ($ qb ->expr ()->notIn ('d.filetype ' , ':hiddenFiletypes ' ))
160+ ->setParameter ('hiddenFiletypes ' , $ hiddenSystemTypes )
161+ ;
162+ }
163+
108164 $ loadNode = !empty ($ query ['loadNode ' ]) && 1 === (int ) $ query ['loadNode ' ];
109165
110166 $ parentNodeId = 0 ;
0 commit comments